@angular/youtube-player 18.2.0-next.2 → 18.2.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,15 +9,15 @@ import { NgModule } from '@angular/core';
9
9
  import { YouTubePlayer } from './youtube-player';
10
10
  import * as i0 from "@angular/core";
11
11
  export class YouTubePlayerModule {
12
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
13
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayerModule, imports: [YouTubePlayer], exports: [YouTubePlayer] }); }
14
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayerModule }); }
12
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
13
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerModule, imports: [YouTubePlayer], exports: [YouTubePlayer] }); }
14
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerModule }); }
15
15
  }
16
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayerModule, decorators: [{
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerModule, decorators: [{
17
17
  type: NgModule,
18
18
  args: [{
19
19
  imports: [YouTubePlayer],
20
20
  exports: [YouTubePlayer],
21
21
  }]
22
22
  }] });
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW91dHViZS1tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMveW91dHViZS1wbGF5ZXIveW91dHViZS1tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7O0FBTS9DLE1BQU0sT0FBTyxtQkFBbUI7OEdBQW5CLG1CQUFtQjsrR0FBbkIsbUJBQW1CLFlBSHBCLGFBQWEsYUFDYixhQUFhOytHQUVaLG1CQUFtQjs7MkZBQW5CLG1CQUFtQjtrQkFKL0IsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUM7b0JBQ3hCLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQztpQkFDekIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1lvdVR1YmVQbGF5ZXJ9IGZyb20gJy4veW91dHViZS1wbGF5ZXInO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbWW91VHViZVBsYXllcl0sXG4gIGV4cG9ydHM6IFtZb3VUdWJlUGxheWVyXSxcbn0pXG5leHBvcnQgY2xhc3MgWW91VHViZVBsYXllck1vZHVsZSB7fVxuIl19
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW91dHViZS1tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMveW91dHViZS1wbGF5ZXIveW91dHViZS1tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7O0FBTS9DLE1BQU0sT0FBTyxtQkFBbUI7cUhBQW5CLG1CQUFtQjtzSEFBbkIsbUJBQW1CLFlBSHBCLGFBQWEsYUFDYixhQUFhO3NIQUVaLG1CQUFtQjs7a0dBQW5CLG1CQUFtQjtrQkFKL0IsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUM7b0JBQ3hCLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQztpQkFDekIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1lvdVR1YmVQbGF5ZXJ9IGZyb20gJy4veW91dHViZS1wbGF5ZXInO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbWW91VHViZVBsYXllcl0sXG4gIGV4cG9ydHM6IFtZb3VUdWJlUGxheWVyXSxcbn0pXG5leHBvcnQgY2xhc3MgWW91VHViZVBsYXllck1vZHVsZSB7fVxuIl19
@@ -22,8 +22,8 @@ export class YouTubePlayerPlaceholder {
22
22
  }
23
23
  return `url(${url})`;
24
24
  }
25
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayerPlaceholder, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: YouTubePlayerPlaceholder, isStandalone: true, selector: "youtube-player-placeholder", inputs: { videoId: "videoId", width: "width", height: "height", isLoading: "isLoading", buttonLabel: "buttonLabel", quality: "quality" }, host: { properties: { "class.youtube-player-placeholder-loading": "isLoading", "style.background-image": "_getBackgroundImage()", "style.width.px": "width", "style.height.px": "height" }, classAttribute: "youtube-player-placeholder" }, ngImport: i0, template: `
25
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerPlaceholder, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0-next.2", type: YouTubePlayerPlaceholder, isStandalone: true, selector: "youtube-player-placeholder", inputs: { videoId: "videoId", width: "width", height: "height", isLoading: "isLoading", buttonLabel: "buttonLabel", quality: "quality" }, host: { properties: { "class.youtube-player-placeholder-loading": "isLoading", "style.background-image": "_getBackgroundImage()", "style.width.px": "width", "style.height.px": "height" }, classAttribute: "youtube-player-placeholder" }, ngImport: i0, template: `
27
27
  <button type="button" class="youtube-player-placeholder-button" [attr.aria-label]="buttonLabel">
28
28
  <svg
29
29
  height="100%"
@@ -37,7 +37,7 @@ export class YouTubePlayerPlaceholder {
37
37
  </button>
38
38
  `, isInline: true, styles: [".youtube-player-placeholder{display:flex;align-items:center;justify-content:center;width:100%;overflow:hidden;cursor:pointer;background-color:#000;background-position:center center;background-size:cover;transition:box-shadow 300ms ease;box-shadow:inset 0 120px 90px -90px rgba(0,0,0,.8)}.youtube-player-placeholder-button{transition:opacity 300ms ease;-moz-appearance:none;-webkit-appearance:none;background:none;border:none;padding:0;display:flex}.youtube-player-placeholder-button svg{width:68px;height:48px}.youtube-player-placeholder-loading{box-shadow:none}.youtube-player-placeholder-loading .youtube-player-placeholder-button{opacity:0}"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
39
39
  }
40
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayerPlaceholder, decorators: [{
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerPlaceholder, decorators: [{
41
41
  type: Component,
42
42
  args: [{ selector: 'youtube-player-placeholder', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
43
43
  <button type="button" class="youtube-player-placeholder-button" [attr.aria-label]="buttonLabel">
@@ -71,4 +71,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
71
71
  }], quality: [{
72
72
  type: Input
73
73
  }] } });
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW91dHViZS1wbGF5ZXItcGxhY2Vob2xkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMveW91dHViZS1wbGF5ZXIveW91dHViZS1wbGF5ZXItcGxhY2Vob2xkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7O0FBZ0MzRixNQUFNLE9BQU8sd0JBQXdCO0lBbUJuQyx5REFBeUQ7SUFDL0MsbUJBQW1CO1FBQzNCLElBQUksR0FBVyxDQUFDO1FBRWhCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMzQixHQUFHLEdBQUcsMEJBQTBCLElBQUksQ0FBQyxPQUFPLGdCQUFnQixDQUFDO1FBQy9ELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDbkMsR0FBRyxHQUFHLDBCQUEwQixJQUFJLENBQUMsT0FBTyxvQkFBb0IsQ0FBQztRQUNuRSxDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsR0FBRywrQkFBK0IsSUFBSSxDQUFDLE9BQU8saUJBQWlCLENBQUM7UUFDckUsQ0FBQztRQUVELE9BQU8sT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUN2QixDQUFDOzhHQWhDVSx3QkFBd0I7a0dBQXhCLHdCQUF3Qiw0Y0F2QnpCOzs7Ozs7Ozs7Ozs7R0FZVDs7MkZBV1Usd0JBQXdCO2tCQTNCcEMsU0FBUzsrQkFDRSw0QkFBNEIsbUJBQ3JCLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksWUFDM0I7Ozs7Ozs7Ozs7OztHQVlULGNBQ1csSUFBSSxRQUVWO3dCQUNKLE9BQU8sRUFBRSw0QkFBNEI7d0JBQ3JDLDRDQUE0QyxFQUFFLFdBQVc7d0JBQ3pELDBCQUEwQixFQUFFLHVCQUF1Qjt3QkFDbkQsa0JBQWtCLEVBQUUsT0FBTzt3QkFDM0IsbUJBQW1CLEVBQUUsUUFBUTtxQkFDOUI7OEJBSVEsT0FBTztzQkFBZixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxNQUFNO3NCQUFkLEtBQUs7Z0JBR0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKiAgUXVhbGl0eSBvZiB0aGUgcGxhY2Vob2xkZXIgaW1hZ2UuICAqL1xuZXhwb3J0IHR5cGUgUGxhY2Vob2xkZXJJbWFnZVF1YWxpdHkgPSAnaGlnaCcgfCAnc3RhbmRhcmQnIHwgJ2xvdyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3lvdXR1YmUtcGxheWVyLXBsYWNlaG9sZGVyJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ5b3V0dWJlLXBsYXllci1wbGFjZWhvbGRlci1idXR0b25cIiBbYXR0ci5hcmlhLWxhYmVsXT1cImJ1dHRvbkxhYmVsXCI+XG4gICAgICA8c3ZnXG4gICAgICAgIGhlaWdodD1cIjEwMCVcIlxuICAgICAgICB2ZXJzaW9uPVwiMS4xXCJcbiAgICAgICAgdmlld0JveD1cIjAgMCA2OCA0OFwiXG4gICAgICAgIGZvY3VzYWJsZT1cImZhbHNlXCJcbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNNjYuNTIsNy43NGMtMC43OC0yLjkzLTIuNDktNS40MS01LjQyLTYuMTlDNTUuNzksLjEzLDM0LDAsMzQsMFMxMi4yMSwuMTMsNi45LDEuNTUgQzMuOTcsMi4zMywyLjI3LDQuODEsMS40OCw3Ljc0QzAuMDYsMTMuMDUsMCwyNCwwLDI0czAuMDYsMTAuOTUsMS40OCwxNi4yNmMwLjc4LDIuOTMsMi40OSw1LjQxLDUuNDIsNi4xOSBDMTIuMjEsNDcuODcsMzQsNDgsMzQsNDhzMjEuNzktMC4xMywyNy4xLTEuNTVjMi45My0wLjc4LDQuNjQtMy4yNiw1LjQyLTYuMTlDNjcuOTQsMzQuOTUsNjgsMjQsNjgsMjRTNjcuOTQsMTMuMDUsNjYuNTIsNy43NHpcIiBmaWxsPVwiI2YwMFwiPjwvcGF0aD5cbiAgICAgICAgPHBhdGggZD1cIk0gNDUsMjQgMjcsMTQgMjcsMzRcIiBmaWxsPVwiI2ZmZlwiPjwvcGF0aD5cbiAgICAgIDwvc3ZnPlxuICAgIDwvYnV0dG9uPlxuICBgLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzdHlsZVVybDogJ3lvdXR1YmUtcGxheWVyLXBsYWNlaG9sZGVyLmNzcycsXG4gIGhvc3Q6IHtcbiAgICAnY2xhc3MnOiAneW91dHViZS1wbGF5ZXItcGxhY2Vob2xkZXInLFxuICAgICdbY2xhc3MueW91dHViZS1wbGF5ZXItcGxhY2Vob2xkZXItbG9hZGluZ10nOiAnaXNMb2FkaW5nJyxcbiAgICAnW3N0eWxlLmJhY2tncm91bmQtaW1hZ2VdJzogJ19nZXRCYWNrZ3JvdW5kSW1hZ2UoKScsXG4gICAgJ1tzdHlsZS53aWR0aC5weF0nOiAnd2lkdGgnLFxuICAgICdbc3R5bGUuaGVpZ2h0LnB4XSc6ICdoZWlnaHQnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBZb3VUdWJlUGxheWVyUGxhY2Vob2xkZXIge1xuICAvKiogSUQgb2YgdGhlIHZpZGVvIGZvciB3aGljaCB0byBzaG93IHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgQElucHV0KCkgdmlkZW9JZDogc3RyaW5nO1xuXG4gIC8qKiBXaWR0aCBvZiB0aGUgdmlkZW8gZm9yIHdoaWNoIHRvIHNob3cgdGhlIHBsYWNlaG9sZGVyLiAqL1xuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyO1xuXG4gIC8qKiBIZWlnaHQgb2YgdGhlIHZpZGVvIGZvciB3aGljaCB0byBzaG93IHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgQElucHV0KCkgaGVpZ2h0OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHZpZGVvIGlzIGN1cnJlbnRseSBiZWluZyBsb2FkZWQuICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZzogYm9vbGVhbjtcblxuICAvKiogQWNjZXNzaWJsZSBsYWJlbCBmb3IgdGhlIHBsYXkgYnV0dG9uLiAqL1xuICBASW5wdXQoKSBidXR0b25MYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBRdWFsaXR5IG9mIHRoZSBwbGFjZWhvbGRlciBpbWFnZS4gKi9cbiAgQElucHV0KCkgcXVhbGl0eTogUGxhY2Vob2xkZXJJbWFnZVF1YWxpdHk7XG5cbiAgLyoqIEdldHMgdGhlIGJhY2tncm91bmQgaW1hZ2Ugc2hvd2luZyB0aGUgcGxhY2Vob2xkZXIuICovXG4gIHByb3RlY3RlZCBfZ2V0QmFja2dyb3VuZEltYWdlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHVybDogc3RyaW5nO1xuXG4gICAgaWYgKHRoaXMucXVhbGl0eSA9PT0gJ2xvdycpIHtcbiAgICAgIHVybCA9IGBodHRwczovL2kueXRpbWcuY29tL3ZpLyR7dGhpcy52aWRlb0lkfS9ocWRlZmF1bHQuanBnYDtcbiAgICB9IGVsc2UgaWYgKHRoaXMucXVhbGl0eSA9PT0gJ2hpZ2gnKSB7XG4gICAgICB1cmwgPSBgaHR0cHM6Ly9pLnl0aW1nLmNvbS92aS8ke3RoaXMudmlkZW9JZH0vbWF4cmVzZGVmYXVsdC5qcGdgO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cmwgPSBgaHR0cHM6Ly9pLnl0aW1nLmNvbS92aV93ZWJwLyR7dGhpcy52aWRlb0lkfS9zZGRlZmF1bHQud2VicGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGB1cmwoJHt1cmx9KWA7XG4gIH1cbn1cbiJdfQ==
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW91dHViZS1wbGF5ZXItcGxhY2Vob2xkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMveW91dHViZS1wbGF5ZXIveW91dHViZS1wbGF5ZXItcGxhY2Vob2xkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7O0FBZ0MzRixNQUFNLE9BQU8sd0JBQXdCO0lBbUJuQyx5REFBeUQ7SUFDL0MsbUJBQW1CO1FBQzNCLElBQUksR0FBVyxDQUFDO1FBRWhCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMzQixHQUFHLEdBQUcsMEJBQTBCLElBQUksQ0FBQyxPQUFPLGdCQUFnQixDQUFDO1FBQy9ELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDbkMsR0FBRyxHQUFHLDBCQUEwQixJQUFJLENBQUMsT0FBTyxvQkFBb0IsQ0FBQztRQUNuRSxDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsR0FBRywrQkFBK0IsSUFBSSxDQUFDLE9BQU8saUJBQWlCLENBQUM7UUFDckUsQ0FBQztRQUVELE9BQU8sT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUN2QixDQUFDO3FIQWhDVSx3QkFBd0I7eUdBQXhCLHdCQUF3Qiw0Y0F2QnpCOzs7Ozs7Ozs7Ozs7R0FZVDs7a0dBV1Usd0JBQXdCO2tCQTNCcEMsU0FBUzsrQkFDRSw0QkFBNEIsbUJBQ3JCLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksWUFDM0I7Ozs7Ozs7Ozs7OztHQVlULGNBQ1csSUFBSSxRQUVWO3dCQUNKLE9BQU8sRUFBRSw0QkFBNEI7d0JBQ3JDLDRDQUE0QyxFQUFFLFdBQVc7d0JBQ3pELDBCQUEwQixFQUFFLHVCQUF1Qjt3QkFDbkQsa0JBQWtCLEVBQUUsT0FBTzt3QkFDM0IsbUJBQW1CLEVBQUUsUUFBUTtxQkFDOUI7OEJBSVEsT0FBTztzQkFBZixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxNQUFNO3NCQUFkLEtBQUs7Z0JBR0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKiAgUXVhbGl0eSBvZiB0aGUgcGxhY2Vob2xkZXIgaW1hZ2UuICAqL1xuZXhwb3J0IHR5cGUgUGxhY2Vob2xkZXJJbWFnZVF1YWxpdHkgPSAnaGlnaCcgfCAnc3RhbmRhcmQnIHwgJ2xvdyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3lvdXR1YmUtcGxheWVyLXBsYWNlaG9sZGVyJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ5b3V0dWJlLXBsYXllci1wbGFjZWhvbGRlci1idXR0b25cIiBbYXR0ci5hcmlhLWxhYmVsXT1cImJ1dHRvbkxhYmVsXCI+XG4gICAgICA8c3ZnXG4gICAgICAgIGhlaWdodD1cIjEwMCVcIlxuICAgICAgICB2ZXJzaW9uPVwiMS4xXCJcbiAgICAgICAgdmlld0JveD1cIjAgMCA2OCA0OFwiXG4gICAgICAgIGZvY3VzYWJsZT1cImZhbHNlXCJcbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNNjYuNTIsNy43NGMtMC43OC0yLjkzLTIuNDktNS40MS01LjQyLTYuMTlDNTUuNzksLjEzLDM0LDAsMzQsMFMxMi4yMSwuMTMsNi45LDEuNTUgQzMuOTcsMi4zMywyLjI3LDQuODEsMS40OCw3Ljc0QzAuMDYsMTMuMDUsMCwyNCwwLDI0czAuMDYsMTAuOTUsMS40OCwxNi4yNmMwLjc4LDIuOTMsMi40OSw1LjQxLDUuNDIsNi4xOSBDMTIuMjEsNDcuODcsMzQsNDgsMzQsNDhzMjEuNzktMC4xMywyNy4xLTEuNTVjMi45My0wLjc4LDQuNjQtMy4yNiw1LjQyLTYuMTlDNjcuOTQsMzQuOTUsNjgsMjQsNjgsMjRTNjcuOTQsMTMuMDUsNjYuNTIsNy43NHpcIiBmaWxsPVwiI2YwMFwiPjwvcGF0aD5cbiAgICAgICAgPHBhdGggZD1cIk0gNDUsMjQgMjcsMTQgMjcsMzRcIiBmaWxsPVwiI2ZmZlwiPjwvcGF0aD5cbiAgICAgIDwvc3ZnPlxuICAgIDwvYnV0dG9uPlxuICBgLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzdHlsZVVybDogJ3lvdXR1YmUtcGxheWVyLXBsYWNlaG9sZGVyLmNzcycsXG4gIGhvc3Q6IHtcbiAgICAnY2xhc3MnOiAneW91dHViZS1wbGF5ZXItcGxhY2Vob2xkZXInLFxuICAgICdbY2xhc3MueW91dHViZS1wbGF5ZXItcGxhY2Vob2xkZXItbG9hZGluZ10nOiAnaXNMb2FkaW5nJyxcbiAgICAnW3N0eWxlLmJhY2tncm91bmQtaW1hZ2VdJzogJ19nZXRCYWNrZ3JvdW5kSW1hZ2UoKScsXG4gICAgJ1tzdHlsZS53aWR0aC5weF0nOiAnd2lkdGgnLFxuICAgICdbc3R5bGUuaGVpZ2h0LnB4XSc6ICdoZWlnaHQnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBZb3VUdWJlUGxheWVyUGxhY2Vob2xkZXIge1xuICAvKiogSUQgb2YgdGhlIHZpZGVvIGZvciB3aGljaCB0byBzaG93IHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgQElucHV0KCkgdmlkZW9JZDogc3RyaW5nO1xuXG4gIC8qKiBXaWR0aCBvZiB0aGUgdmlkZW8gZm9yIHdoaWNoIHRvIHNob3cgdGhlIHBsYWNlaG9sZGVyLiAqL1xuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyO1xuXG4gIC8qKiBIZWlnaHQgb2YgdGhlIHZpZGVvIGZvciB3aGljaCB0byBzaG93IHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgQElucHV0KCkgaGVpZ2h0OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHZpZGVvIGlzIGN1cnJlbnRseSBiZWluZyBsb2FkZWQuICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZzogYm9vbGVhbjtcblxuICAvKiogQWNjZXNzaWJsZSBsYWJlbCBmb3IgdGhlIHBsYXkgYnV0dG9uLiAqL1xuICBASW5wdXQoKSBidXR0b25MYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBRdWFsaXR5IG9mIHRoZSBwbGFjZWhvbGRlciBpbWFnZS4gKi9cbiAgQElucHV0KCkgcXVhbGl0eTogUGxhY2Vob2xkZXJJbWFnZVF1YWxpdHk7XG5cbiAgLyoqIEdldHMgdGhlIGJhY2tncm91bmQgaW1hZ2Ugc2hvd2luZyB0aGUgcGxhY2Vob2xkZXIuICovXG4gIHByb3RlY3RlZCBfZ2V0QmFja2dyb3VuZEltYWdlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHVybDogc3RyaW5nO1xuXG4gICAgaWYgKHRoaXMucXVhbGl0eSA9PT0gJ2xvdycpIHtcbiAgICAgIHVybCA9IGBodHRwczovL2kueXRpbWcuY29tL3ZpLyR7dGhpcy52aWRlb0lkfS9ocWRlZmF1bHQuanBnYDtcbiAgICB9IGVsc2UgaWYgKHRoaXMucXVhbGl0eSA9PT0gJ2hpZ2gnKSB7XG4gICAgICB1cmwgPSBgaHR0cHM6Ly9pLnl0aW1nLmNvbS92aS8ke3RoaXMudmlkZW9JZH0vbWF4cmVzZGVmYXVsdC5qcGdgO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cmwgPSBgaHR0cHM6Ly9pLnl0aW1nLmNvbS92aV93ZWJwLyR7dGhpcy52aWRlb0lkfS9zZGRlZmF1bHQud2VicGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGB1cmwoJHt1cmx9KWA7XG4gIH1cbn1cbiJdfQ==
@@ -474,8 +474,8 @@ export class YouTubePlayer {
474
474
  // Ensures that everything is cleared out on destroy.
475
475
  takeUntil(this._destroyed));
476
476
  }
477
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayer, deps: [{ token: i0.NgZone }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
478
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: YouTubePlayer, isStandalone: true, selector: "youtube-player", inputs: { videoId: "videoId", height: ["height", "height", numberAttribute], width: ["width", "width", numberAttribute], startSeconds: ["startSeconds", "startSeconds", coerceTime], endSeconds: ["endSeconds", "endSeconds", coerceTime], suggestedQuality: "suggestedQuality", playerVars: "playerVars", disableCookies: ["disableCookies", "disableCookies", booleanAttribute], loadApi: ["loadApi", "loadApi", booleanAttribute], disablePlaceholder: ["disablePlaceholder", "disablePlaceholder", booleanAttribute], showBeforeIframeApiLoads: ["showBeforeIframeApiLoads", "showBeforeIframeApiLoads", booleanAttribute], placeholderButtonLabel: "placeholderButtonLabel", placeholderImageQuality: "placeholderImageQuality" }, outputs: { ready: "ready", stateChange: "stateChange", error: "error", apiChange: "apiChange", playbackQualityChange: "playbackQualityChange", playbackRateChange: "playbackRateChange" }, viewQueries: [{ propertyName: "youtubeContainer", first: true, predicate: ["youtubeContainer"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
477
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayer, deps: [{ token: i0.NgZone }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
478
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0-next.2", type: YouTubePlayer, isStandalone: true, selector: "youtube-player", inputs: { videoId: "videoId", height: ["height", "height", numberAttribute], width: ["width", "width", numberAttribute], startSeconds: ["startSeconds", "startSeconds", coerceTime], endSeconds: ["endSeconds", "endSeconds", coerceTime], suggestedQuality: "suggestedQuality", playerVars: "playerVars", disableCookies: ["disableCookies", "disableCookies", booleanAttribute], loadApi: ["loadApi", "loadApi", booleanAttribute], disablePlaceholder: ["disablePlaceholder", "disablePlaceholder", booleanAttribute], showBeforeIframeApiLoads: ["showBeforeIframeApiLoads", "showBeforeIframeApiLoads", booleanAttribute], placeholderButtonLabel: "placeholderButtonLabel", placeholderImageQuality: "placeholderImageQuality" }, outputs: { ready: "ready", stateChange: "stateChange", error: "error", apiChange: "apiChange", playbackQualityChange: "playbackQualityChange", playbackRateChange: "playbackRateChange" }, viewQueries: [{ propertyName: "youtubeContainer", first: true, predicate: ["youtubeContainer"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
479
479
  @if (_shouldShowPlaceholder()) {
480
480
  <youtube-player-placeholder
481
481
  [videoId]="videoId!"
@@ -491,7 +491,7 @@ export class YouTubePlayer {
491
491
  </div>
492
492
  `, isInline: true, dependencies: [{ kind: "component", type: YouTubePlayerPlaceholder, selector: "youtube-player-placeholder", inputs: ["videoId", "width", "height", "isLoading", "buttonLabel", "quality"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
493
493
  }
494
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayer, decorators: [{
494
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayer, decorators: [{
495
495
  type: Component,
496
496
  args: [{
497
497
  selector: 'youtube-player',
@@ -599,4 +599,4 @@ function loadApi(nonce) {
599
599
  apiLoaded = true;
600
600
  document.body.appendChild(script);
601
601
  }
602
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW91dHViZS1wbGF5ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMveW91dHViZS1wbGF5ZXIveW91dHViZS1wbGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgseUVBQXlFO0FBQ3pFLGlEQUFpRDtBQUVqRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFFTixNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sV0FBVyxFQUdYLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsY0FBYyxFQUNkLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBRWxCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLFlBQVksRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2hHLE9BQU8sRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUEwQix3QkFBd0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDOztBQVMvRiw2REFBNkQ7QUFDN0QsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQ3JELHVCQUF1QixDQUN4QixDQUFDO0FBd0JGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQUN4QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFjekMseUNBQXlDO0FBQ3pDLFNBQVMsVUFBVSxDQUFDLEtBQXlCO0lBQzNDLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxlQUFlLENB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LEVBQUUsQ0FBQyxDQUFDO1lBQzFELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLE1BQWMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQzFCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBRXBCLElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDRFQUE0RTtJQUM1RSxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gV29ya2Fyb3VuZCBmb3I6IGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL3J1bGVzX25vZGVqcy9pc3N1ZXMvMTI2NVxuLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJ5b3V0dWJlXCIgcHJlc2VydmU9XCJ0cnVlXCIgLz5cblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIEluamVjdCxcbiAgUExBVEZPUk1fSUQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgbnVtYmVyQXR0cmlidXRlLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgaW5qZWN0LFxuICBDU1BfTk9OQ0UsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBBZnRlclZpZXdJbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7aXNQbGF0Zm9ybUJyb3dzZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge09ic2VydmFibGUsIG9mIGFzIG9ic2VydmFibGVPZiwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0LCBmcm9tRXZlbnRQYXR0ZXJufSBmcm9tICdyeGpzJztcbmltcG9ydCB7dGFrZVVudGlsLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7UGxhY2Vob2xkZXJJbWFnZVF1YWxpdHksIFlvdVR1YmVQbGF5ZXJQbGFjZWhvbGRlcn0gZnJvbSAnLi95b3V0dWJlLXBsYXllci1wbGFjZWhvbGRlcic7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgWVQ6IHR5cGVvZiBZVCB8IHVuZGVmaW5lZDtcbiAgICBvbllvdVR1YmVJZnJhbWVBUElSZWFkeTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBJbmplY3Rpb24gdG9rZW4gdXNlZCB0byBjb25maWd1cmUgdGhlIGBZb3VUdWJlUGxheWVyYC4gKi9cbmV4cG9ydCBjb25zdCBZT1VUVUJFX1BMQVlFUl9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48WW91VHViZVBsYXllckNvbmZpZz4oXG4gICdZT1VUVUJFX1BMQVlFUl9DT05GSUcnLFxuKTtcblxuLyoqIE9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYFlvdVR1YmVQbGF5ZXJgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBZb3VUdWJlUGxheWVyQ29uZmlnIHtcbiAgLyoqIFdoZXRoZXIgdG8gbG9hZCB0aGUgWW91VHViZSBpZnJhbWUgQVBJIGF1dG9tYXRpY2FsbHkuIERlZmF1bHRzIHRvIGB0cnVlYC4gKi9cbiAgbG9hZEFwaT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIHBsYXllciBzaG93cyBhIHBsYWNlaG9sZGVyIGltYWdlIGluc3RlYWQgb2YgbG9hZGluZyB0aGUgWW91VHViZSBBUEkgd2hpY2hcbiAgICogaW1wcm92ZXMgdGhlIGluaXRpYWwgcGFnZSBsb2FkIHBlcmZvcm1hbmNlLiBVc2UgdGhpcyBvcHRpb24gdG8gZGlzYWJsZSB0aGUgcGxhY2Vob2xkZXIgbG9hZGluZ1xuICAgKiBiZWhhdmlvciBnbG9iYWxseS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGRpc2FibGVQbGFjZWhvbGRlcj86IGJvb2xlYW47XG5cbiAgLyoqIEFjY2Vzc2libGUgbGFiZWwgZm9yIHRoZSBwbGF5IGJ1dHRvbiBpbnNpZGUgb2YgdGhlIHBsYWNlaG9sZGVyLiAqL1xuICBwbGFjZWhvbGRlckJ1dHRvbkxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBRdWFsaXR5IG9mIHRoZSBkaXNwbGF5ZWQgcGxhY2Vob2xkZXIgaW1hZ2UuIERlZmF1bHRzIHRvIGBzdGFuZGFyZGAsXG4gICAqIGJlY2F1c2Ugbm90IGFsbCB2aWRlbyBoYXZlIGEgaGlnaC1xdWFsaXR5IHBsYWNlaG9sZGVyLlxuICAgKi9cbiAgcGxhY2Vob2xkZXJJbWFnZVF1YWxpdHk/OiBQbGFjZWhvbGRlckltYWdlUXVhbGl0eTtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUExBWUVSX1dJRFRIID0gNjQwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUExBWUVSX0hFSUdIVCA9IDM5MDtcblxuLyoqXG4gKiBPYmplY3QgdXNlZCB0byBzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIHBsYXllciBpZiB0aGVcbiAqIHVzZXIgdHJpZXMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgQVBJIGJlZm9yZSBpdCBoYXMgYmVlbiBsb2FkZWQuXG4gKi9cbmludGVyZmFjZSBQZW5kaW5nUGxheWVyU3RhdGUge1xuICBwbGF5YmFja1N0YXRlPzogUGxheWVyU3RhdGUuUExBWUlORyB8IFBsYXllclN0YXRlLlBBVVNFRCB8IFBsYXllclN0YXRlLkNVRUQ7XG4gIHBsYXliYWNrUmF0ZT86IG51bWJlcjtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBtdXRlZD86IGJvb2xlYW47XG4gIHNlZWs/OiB7c2Vjb25kczogbnVtYmVyOyBhbGxvd1NlZWtBaGVhZDogYm9vbGVhbn07XG59XG5cbi8qKiBDb2VyY2lvbiBmdW5jdGlvbiBmb3IgdGltZSB2YWx1ZXMuICovXG5mdW5jdGlvbiBjb2VyY2VUaW1lKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHZhbHVlIDogbnVtYmVyQXR0cmlidXRlKHZhbHVlLCAwKTtcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IG9mIGBZVC5QbGF5ZXJTdGF0ZWAgd2hpY2ggd2UgY2FuJ3QgdXNlLCBiZWNhdXNlIGl0J3MgbWVhbnQgdG9cbiAqIGJlIHJlYWQgb2ZmIHRoZSBgd2luZG93YCB3aGljaCB3ZSBjYW4ndCBkbyBiZWZvcmUgdGhlIEFQSSBoYXMgYmVlbiBsb2FkZWQuXG4gKi9cbmVudW0gUGxheWVyU3RhdGUge1xuICBVTlNUQVJURUQgPSAtMSxcbiAgRU5ERUQgPSAwLFxuICBQTEFZSU5HID0gMSxcbiAgUEFVU0VEID0gMixcbiAgQlVGRkVSSU5HID0gMyxcbiAgQ1VFRCA9IDUsXG59XG5cbi8qKlxuICogQW5ndWxhciBjb21wb25lbnQgdGhhdCByZW5kZXJzIGEgWW91VHViZSBwbGF5ZXIgdmlhIHRoZSBZb3VUdWJlIHBsYXllclxuICogaWZyYW1lIEFQSS5cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd5b3V0dWJlLXBsYXllcicsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbWW91VHViZVBsYXllclBsYWNlaG9sZGVyXSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKF9zaG91bGRTaG93UGxhY2Vob2xkZXIoKSkge1xuICAgICAgPHlvdXR1YmUtcGxheWVyLXBsYWNlaG9sZGVyXG4gICAgICAgIFt2aWRlb0lkXT1cInZpZGVvSWQhXCJcbiAgICAgICAgW3dpZHRoXT1cIndpZHRoXCJcbiAgICAgICAgW2hlaWdodF09XCJoZWlnaHRcIlxuICAgICAgICBbaXNMb2FkaW5nXT1cIl9pc0xvYWRpbmdcIlxuICAgICAgICBbYnV0dG9uTGFiZWxdPVwicGxhY2Vob2xkZXJCdXR0b25MYWJlbFwiXG4gICAgICAgIFtxdWFsaXR5XT1cInBsYWNlaG9sZGVySW1hZ2VRdWFsaXR5XCJcbiAgICAgICAgKGNsaWNrKT1cIl9sb2FkKHRydWUpXCIvPlxuICAgIH1cbiAgICA8ZGl2IFtzdHlsZS5kaXNwbGF5XT1cIl9zaG91bGRTaG93UGxhY2Vob2xkZXIoKSA/ICdub25lJyA6ICcnXCI+XG4gICAgICA8ZGl2ICN5b3V0dWJlQ29udGFpbmVyPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBZb3VUdWJlUGxheWVyIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKiogV2hldGhlciB3ZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nIGluc2lkZSBhIGJyb3dzZXIuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lzQnJvd3NlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfcGxheWVyOiBZVC5QbGF5ZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3BlbmRpbmdQbGF5ZXI6IFlULlBsYXllciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfZXhpc3RpbmdBcGlSZWFkeUNhbGxiYWNrOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3BlbmRpbmdQbGF5ZXJTdGF0ZTogUGVuZGluZ1BsYXllclN0YXRlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wbGF5ZXJDaGFuZ2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxZVC5QbGF5ZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX25vbmNlID0gaW5qZWN0KENTUF9OT05DRSwge29wdGlvbmFsOiB0cnVlfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5nZURldGVjdG9yUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJvdGVjdGVkIF9pc0xvYWRpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9oYXNQbGFjZWhvbGRlciA9IHRydWU7XG5cbiAgLyoqIFlvdVR1YmUgVmlkZW8gSUQgdG8gdmlldyAqL1xuICBASW5wdXQoKVxuICB2aWRlb0lkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIEhlaWdodCBvZiB2aWRlbyBwbGF5ZXIgKi9cbiAgQElucHV0KHt0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZX0pXG4gIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICB9XG4gIHNldCBoZWlnaHQoaGVpZ2h0OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQgPT0gbnVsbCB8fCBpc05hTihoZWlnaHQpID8gREVGQVVMVF9QTEFZRVJfSEVJR0hUIDogaGVpZ2h0O1xuICB9XG4gIHByaXZhdGUgX2hlaWdodCA9IERFRkFVTFRfUExBWUVSX0hFSUdIVDtcblxuICAvKiogV2lkdGggb2YgdmlkZW8gcGxheWVyICovXG4gIEBJbnB1dCh7dHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGV9KVxuICBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gIH1cbiAgc2V0IHdpZHRoKHdpZHRoOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl93aWR0aCA9IHdpZHRoID09IG51bGwgfHwgaXNOYU4od2lkdGgpID8gREVGQVVMVF9QTEFZRVJfV0lEVEggOiB3aWR0aDtcbiAgfVxuICBwcml2YXRlIF93aWR0aCA9IERFRkFVTFRfUExBWUVSX1dJRFRIO1xuXG4gIC8qKiBUaGUgbW9tZW50IHdoZW4gdGhlIHBsYXllciBpcyBzdXBwb3NlZCB0byBzdGFydCBwbGF5aW5nICovXG4gIEBJbnB1dCh7dHJhbnNmb3JtOiBjb2VyY2VUaW1lfSlcbiAgc3RhcnRTZWNvbmRzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBtb21lbnQgd2hlbiB0aGUgcGxheWVyIGlzIHN1cHBvc2VkIHRvIHN0b3AgcGxheWluZyAqL1xuICBASW5wdXQoe3RyYW5zZm9ybTogY29lcmNlVGltZX0pXG4gIGVuZFNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIHN1Z2dlc3RlZCBxdWFsaXR5IG9mIHRoZSBwbGF5ZXIgKi9cbiAgQElucHV0KClcbiAgc3VnZ2VzdGVkUXVhbGl0eTogWVQuU3VnZ2VzdGVkVmlkZW9RdWFsaXR5IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBFeHRyYSBwYXJhbWV0ZXJzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBwbGF5ZXIuIFNlZTpcbiAgICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9wbGF5ZXJfcGFyYW1ldGVycy5odG1sP3BsYXllclZlcnNpb249SFRNTDUjUGFyYW1ldGVyc1xuICAgKi9cbiAgQElucHV0KClcbiAgcGxheWVyVmFyczogWVQuUGxheWVyVmFycyB8IHVuZGVmaW5lZDtcblxuICAvKiogV2hldGhlciBjb29raWVzIGluc2lkZSB0aGUgcGxheWVyIGhhdmUgYmVlbiBkaXNhYmxlZC4gKi9cbiAgQElucHV0KHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KVxuICBkaXNhYmxlQ29va2llczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgbG9hZCB0aGUgWW91VHViZSBpZnJhbWUgQVBJLiBEZWZhdWx0cyB0byBgdHJ1ZWAuICovXG4gIEBJbnB1dCh7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSlcbiAgbG9hZEFwaTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgcGxheWVyIHNob3dzIGEgcGxhY2Vob2xkZXIgaW1hZ2UgaW5zdGVhZCBvZiBsb2FkaW5nIHRoZSBZb3VUdWJlIEFQSSB3aGljaFxuICAgKiBpbXByb3ZlcyB0aGUgaW5pdGlhbCBwYWdlIGxvYWQgcGVyZm9ybWFuY2UuIFRoaXMgaW5wdXQgYWxsb3dzIGZvciB0aGUgYmVoYXZpb3IgdG8gYmUgZGlzYWJsZWQuXG4gICAqL1xuICBASW5wdXQoe3RyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZX0pXG4gIGRpc2FibGVQbGFjZWhvbGRlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBpZnJhbWUgd2lsbCBhdHRlbXB0IHRvIGxvYWQgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzIG9mIHRoZSBhcGkgb24gdGhlXG4gICAqIHBhZ2UuIFNldCB0aGlzIHRvIHRydWUgaWYgeW91IGRvbid0IHdhbnQgdGhlIGBvbllvdVR1YmVJZnJhbWVBUElSZWFkeWAgZmllbGQgdG8gYmVcbiAgICogc2V0IG9uIHRoZSBnbG9iYWwgd2luZG93LlxuICAgKi9cbiAgQElucHV0KHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KSBzaG93QmVmb3JlSWZyYW1lQXBpTG9hZHM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogQWNjZXNzaWJsZSBsYWJlbCBmb3IgdGhlIHBsYXkgYnV0dG9uIGluc2lkZSBvZiB0aGUgcGxhY2Vob2xkZXIuICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyQnV0dG9uTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogUXVhbGl0eSBvZiB0aGUgZGlzcGxheWVkIHBsYWNlaG9sZGVyIGltYWdlLiBEZWZhdWx0cyB0byBgc3RhbmRhcmRgLFxuICAgKiBiZWNhdXNlIG5vdCBhbGwgdmlkZW8gaGF2ZSBhIGhpZ2gtcXVhbGl0eSBwbGFjZWhvbGRlci5cbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVySW1hZ2VRdWFsaXR5OiBQbGFjZWhvbGRlckltYWdlUXVhbGl0eTtcblxuICAvKiogT3V0cHV0cyBhcmUgZGlyZWN0IHByb3hpZXMgZnJvbSB0aGUgcGxheWVyIGl0c2VsZi4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHJlYWR5OiBPYnNlcnZhYmxlPFlULlBsYXllckV2ZW50PiA9XG4gICAgdGhpcy5fZ2V0TGF6eUVtaXR0ZXI8WVQuUGxheWVyRXZlbnQ+KCdvblJlYWR5Jyk7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHN0YXRlQ2hhbmdlOiBPYnNlcnZhYmxlPFlULk9uU3RhdGVDaGFuZ2VFdmVudD4gPVxuICAgIHRoaXMuX2dldExhenlFbWl0dGVyPFlULk9uU3RhdGVDaGFuZ2VFdmVudD4oJ29uU3RhdGVDaGFuZ2UnKTtcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgZXJyb3I6IE9ic2VydmFibGU8WVQuT25FcnJvckV2ZW50PiA9XG4gICAgdGhpcy5fZ2V0TGF6eUVtaXR0ZXI8WVQuT25FcnJvckV2ZW50Pignb25FcnJvcicpO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBhcGlDaGFuZ2U6IE9ic2VydmFibGU8WVQuUGxheWVyRXZlbnQ+ID1cbiAgICB0aGlzLl9nZXRMYXp5RW1pdHRlcjxZVC5QbGF5ZXJFdmVudD4oJ29uQXBpQ2hhbmdlJyk7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHBsYXliYWNrUXVhbGl0eUNoYW5nZTogT2JzZXJ2YWJsZTxZVC5PblBsYXliYWNrUXVhbGl0eUNoYW5nZUV2ZW50PiA9XG4gICAgdGhpcy5fZ2V0TGF6eUVtaXR0ZXI8WVQuT25QbGF5YmFja1F1YWxpdHlDaGFuZ2VFdmVudD4oJ29uUGxheWJhY2tRdWFsaXR5Q2hhbmdlJyk7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHBsYXliYWNrUmF0ZUNoYW5nZTogT2JzZXJ2YWJsZTxZVC5PblBsYXliYWNrUmF0ZUNoYW5nZUV2ZW50PiA9XG4gICAgdGhpcy5fZ2V0TGF6eUVtaXR0ZXI8WVQuT25QbGF5YmFja1JhdGVDaGFuZ2VFdmVudD4oJ29uUGxheWJhY2tSYXRlQ2hhbmdlJyk7XG5cbiAgLyoqIFRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgaWZyYW1lLiAqL1xuICBAVmlld0NoaWxkKCd5b3V0dWJlQ29udGFpbmVyJywge3N0YXRpYzogdHJ1ZX0pXG4gIHlvdXR1YmVDb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgKSB7XG4gICAgY29uc3QgY29uZmlnID0gaW5qZWN0KFlPVVRVQkVfUExBWUVSX0NPTkZJRywge29wdGlvbmFsOiB0cnVlfSk7XG4gICAgdGhpcy5sb2FkQXBpID0gY29uZmlnPy5sb2FkQXBpID8/IHRydWU7XG4gICAgdGhpcy5kaXNhYmxlUGxhY2Vob2xkZXIgPSAhIWNvbmZpZz8uZGlzYWJsZVBsYWNlaG9sZGVyO1xuICAgIHRoaXMucGxhY2Vob2xkZXJCdXR0b25MYWJlbCA9IGNvbmZpZz8ucGxhY2Vob2xkZXJCdXR0b25MYWJlbCB8fCAnUGxheSB2aWRlbyc7XG4gICAgdGhpcy5wbGFjZWhvbGRlckltYWdlUXVhbGl0eSA9IGNvbmZpZz8ucGxhY2Vob2xkZXJJbWFnZVF1YWxpdHkgfHwgJ3N0YW5kYXJkJztcbiAgICB0aGlzLl9pc0Jyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9jb25kaXRpb25hbGx5TG9hZCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zaG91bGRSZWNyZWF0ZVBsYXllcihjaGFuZ2VzKSkge1xuICAgICAgdGhpcy5fY29uZGl0aW9uYWxseUxvYWQoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgaWYgKGNoYW5nZXNbJ3dpZHRoJ10gfHwgY2hhbmdlc1snaGVpZ2h0J10pIHtcbiAgICAgICAgdGhpcy5fc2V0U2l6ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlc1snc3VnZ2VzdGVkUXVhbGl0eSddKSB7XG4gICAgICAgIHRoaXMuX3NldFF1YWxpdHkoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZXNbJ3N0YXJ0U2Vjb25kcyddIHx8IGNoYW5nZXNbJ2VuZFNlY29uZHMnXSB8fCBjaGFuZ2VzWydzdWdnZXN0ZWRRdWFsaXR5J10pIHtcbiAgICAgICAgdGhpcy5fY3VlUGxheWVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fcGVuZGluZ1BsYXllcj8uZGVzdHJveSgpO1xuXG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgdGhpcy5fcGxheWVyLmRlc3Ryb3koKTtcbiAgICAgIHdpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeSA9IHRoaXMuX2V4aXN0aW5nQXBpUmVhZHlDYWxsYmFjaztcbiAgICB9XG5cbiAgICB0aGlzLl9wbGF5ZXJDaGFuZ2VzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNwbGF5VmlkZW8gKi9cbiAgcGxheVZpZGVvKCkge1xuICAgIGlmICh0aGlzLl9wbGF5ZXIpIHtcbiAgICAgIHRoaXMuX3BsYXllci5wbGF5VmlkZW8oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZ2V0UGVuZGluZ1N0YXRlKCkucGxheWJhY2tTdGF0ZSA9IFBsYXllclN0YXRlLlBMQVlJTkc7XG4gICAgICB0aGlzLl9sb2FkKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNwYXVzZVZpZGVvICovXG4gIHBhdXNlVmlkZW8oKSB7XG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgdGhpcy5fcGxheWVyLnBhdXNlVmlkZW8oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZ2V0UGVuZGluZ1N0YXRlKCkucGxheWJhY2tTdGF0ZSA9IFBsYXllclN0YXRlLlBBVVNFRDtcbiAgICB9XG4gIH1cblxuICAvKiogU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvaWZyYW1lX2FwaV9yZWZlcmVuY2Ujc3RvcFZpZGVvICovXG4gIHN0b3BWaWRlbygpIHtcbiAgICBpZiAodGhpcy5fcGxheWVyKSB7XG4gICAgICB0aGlzLl9wbGF5ZXIuc3RvcFZpZGVvKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEl0IHNlZW1zIGxpa2UgWW91VHViZSBzZXRzIHRoZSBwbGF5ZXIgdG8gQ1VFRCB3aGVuIGl0J3Mgc3RvcHBlZC5cbiAgICAgIHRoaXMuX2dldFBlbmRpbmdTdGF0ZSgpLnBsYXliYWNrU3RhdGUgPSBQbGF5ZXJTdGF0ZS5DVUVEO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNzZWVrVG8gKi9cbiAgc2Vla1RvKHNlY29uZHM6IG51bWJlciwgYWxsb3dTZWVrQWhlYWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5fcGxheWVyKSB7XG4gICAgICB0aGlzLl9wbGF5ZXIuc2Vla1RvKHNlY29uZHMsIGFsbG93U2Vla0FoZWFkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZ2V0UGVuZGluZ1N0YXRlKCkuc2VlayA9IHtzZWNvbmRzLCBhbGxvd1NlZWtBaGVhZH07XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS95b3V0dWJlL2lmcmFtZV9hcGlfcmVmZXJlbmNlI211dGUgKi9cbiAgbXV0ZSgpIHtcbiAgICBpZiAodGhpcy5fcGxheWVyKSB7XG4gICAgICB0aGlzLl9wbGF5ZXIubXV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9nZXRQZW5kaW5nU3RhdGUoKS5tdXRlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS95b3V0dWJlL2lmcmFtZV9hcGlfcmVmZXJlbmNlI3VuTXV0ZSAqL1xuICB1bk11dGUoKSB7XG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgdGhpcy5fcGxheWVyLnVuTXV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9nZXRQZW5kaW5nU3RhdGUoKS5tdXRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNpc011dGVkICovXG4gIGlzTXV0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgcmV0dXJuIHRoaXMuX3BsYXllci5pc011dGVkKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZSkge1xuICAgICAgcmV0dXJuICEhdGhpcy5fcGVuZGluZ1BsYXllclN0YXRlLm11dGVkO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNzZXRWb2x1bWUgKi9cbiAgc2V0Vm9sdW1lKHZvbHVtZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgdGhpcy5fcGxheWVyLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9nZXRQZW5kaW5nU3RhdGUoKS52b2x1bWUgPSB2b2x1bWU7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS95b3V0dWJlL2lmcmFtZV9hcGlfcmVmZXJlbmNlI2dldFZvbHVtZSAqL1xuICBnZXRWb2x1bWUoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fcGxheWVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGxheWVyLmdldFZvbHVtZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9wZW5kaW5nUGxheWVyU3RhdGUgJiYgdGhpcy5fcGVuZGluZ1BsYXllclN0YXRlLnZvbHVtZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGVuZGluZ1BsYXllclN0YXRlLnZvbHVtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNzZXRQbGF5YmFja1JhdGUgKi9cbiAgc2V0UGxheWJhY2tSYXRlKHBsYXliYWNrUmF0ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgcmV0dXJuIHRoaXMuX3BsYXllci5zZXRQbGF5YmFja1JhdGUocGxheWJhY2tSYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZ2V0UGVuZGluZ1N0YXRlKCkucGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNnZXRQbGF5YmFja1JhdGUgKi9cbiAgZ2V0UGxheWJhY2tSYXRlKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgcmV0dXJuIHRoaXMuX3BsYXllci5nZXRQbGF5YmFja1JhdGUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGVuZGluZ1BsYXllclN0YXRlICYmIHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZS5wbGF5YmFja1JhdGUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZS5wbGF5YmFja1JhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKiogU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvaWZyYW1lX2FwaV9yZWZlcmVuY2UjZ2V0QXZhaWxhYmxlUGxheWJhY2tSYXRlcyAqL1xuICBnZXRBdmFpbGFibGVQbGF5YmFja1JhdGVzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fcGxheWVyID8gdGhpcy5fcGxheWVyLmdldEF2YWlsYWJsZVBsYXliYWNrUmF0ZXMoKSA6IFtdO1xuICB9XG5cbiAgLyoqIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS95b3V0dWJlL2lmcmFtZV9hcGlfcmVmZXJlbmNlI2dldFZpZGVvTG9hZGVkRnJhY3Rpb24gKi9cbiAgZ2V0VmlkZW9Mb2FkZWRGcmFjdGlvbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9wbGF5ZXIgPyB0aGlzLl9wbGF5ZXIuZ2V0VmlkZW9Mb2FkZWRGcmFjdGlvbigpIDogMDtcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNnZXRQbGF5ZXJTdGF0ZSAqL1xuICBnZXRQbGF5ZXJTdGF0ZSgpOiBZVC5QbGF5ZXJTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9pc0Jyb3dzZXIgfHwgIXdpbmRvdy5ZVCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGxheWVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGxheWVyLmdldFBsYXllclN0YXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZSAmJiB0aGlzLl9wZW5kaW5nUGxheWVyU3RhdGUucGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGVuZGluZ1BsYXllclN0YXRlLnBsYXliYWNrU3RhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIFBsYXllclN0YXRlLlVOU1RBUlRFRDtcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNnZXRDdXJyZW50VGltZSAqL1xuICBnZXRDdXJyZW50VGltZSgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLl9wbGF5ZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGVuZGluZ1BsYXllclN0YXRlICYmIHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZS5zZWVrKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGVuZGluZ1BsYXllclN0YXRlLnNlZWsuc2Vjb25kcztcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNnZXRQbGF5YmFja1F1YWxpdHkgKi9cbiAgZ2V0UGxheWJhY2tRdWFsaXR5KCk6IFlULlN1Z2dlc3RlZFZpZGVvUXVhbGl0eSB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYXllciA/IHRoaXMuX3BsYXllci5nZXRQbGF5YmFja1F1YWxpdHkoKSA6ICdkZWZhdWx0JztcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNnZXRBdmFpbGFibGVRdWFsaXR5TGV2ZWxzICovXG4gIGdldEF2YWlsYWJsZVF1YWxpdHlMZXZlbHMoKTogWVQuU3VnZ2VzdGVkVmlkZW9RdWFsaXR5W10ge1xuICAgIHJldHVybiB0aGlzLl9wbGF5ZXIgPyB0aGlzLl9wbGF5ZXIuZ2V0QXZhaWxhYmxlUXVhbGl0eUxldmVscygpIDogW107XG4gIH1cblxuICAvKiogU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvaWZyYW1lX2FwaV9yZWZlcmVuY2UjZ2V0RHVyYXRpb24gKi9cbiAgZ2V0RHVyYXRpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGxheWVyID8gdGhpcy5fcGxheWVyLmdldER1cmF0aW9uKCkgOiAwO1xuICB9XG5cbiAgLyoqIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS95b3V0dWJlL2lmcmFtZV9hcGlfcmVmZXJlbmNlI2dldFZpZGVvVXJsICovXG4gIGdldFZpZGVvVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYXllciA/IHRoaXMuX3BsYXllci5nZXRWaWRlb1VybCgpIDogJyc7XG4gIH1cblxuICAvKiogU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvaWZyYW1lX2FwaV9yZWZlcmVuY2UjZ2V0VmlkZW9FbWJlZENvZGUgKi9cbiAgZ2V0VmlkZW9FbWJlZENvZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGxheWVyID8gdGhpcy5fcGxheWVyLmdldFZpZGVvRW1iZWRDb2RlKCkgOiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgWW91VHViZSBBUEkgYW5kIHNldHMgdXAgdGhlIHBsYXllci5cbiAgICogQHBhcmFtIHBsYXlWaWRlbyBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgcGxheSB0aGUgdmlkZW8gb25jZSB0aGUgcGxheWVyIGlzIGxvYWRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfbG9hZChwbGF5VmlkZW86IGJvb2xlYW4pIHtcbiAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSdyZSBub3QgaW4gYSBicm93c2VyIGVudmlyb25tZW50LlxuICAgIGlmICghdGhpcy5faXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF3aW5kb3cuWVQgfHwgIXdpbmRvdy5ZVC5QbGF5ZXIpIHtcbiAgICAgIGlmICh0aGlzLmxvYWRBcGkpIHtcbiAgICAgICAgdGhpcy5faXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgbG9hZEFwaSh0aGlzLl9ub25jZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2hvd0JlZm9yZUlmcmFtZUFwaUxvYWRzICYmICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnTmFtZXNwYWNlIFlUIG5vdCBmb3VuZCwgY2Fubm90IGNvbnN0cnVjdCBlbWJlZGRlZCB5b3V0dWJlIHBsYXllci4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIGluc3RhbGwgdGhlIFlvdVR1YmUgUGxheWVyIEFQSSBSZWZlcmVuY2UgZm9yIGlmcmFtZSBFbWJlZHM6ICcgK1xuICAgICAgICAgICAgJ2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvaWZyYW1lX2FwaV9yZWZlcmVuY2UnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9leGlzdGluZ0FwaVJlYWR5Q2FsbGJhY2sgPSB3aW5kb3cub25Zb3VUdWJlSWZyYW1lQVBJUmVhZHk7XG5cbiAgICAgIHdpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fZXhpc3RpbmdBcGlSZWFkeUNhbGxiYWNrPy4oKTtcbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLl9jcmVhdGVQbGF5ZXIocGxheVZpZGVvKSk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jcmVhdGVQbGF5ZXIocGxheVZpZGVvKTtcbiAgICB9XG4gIH1cblxuICAvKiogTG9hZHMgdGhlIHBsYXllciBkZXBlbmRpbmcgb24gdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb21wb25lbnQuICovXG4gIHByaXZhdGUgX2NvbmRpdGlvbmFsbHlMb2FkKCkge1xuICAgIC8vIElmIHRoZSBwbGFjZWhvbGRlciBpc24ndCBzaG93biBhbnltb3JlLCB3ZSBoYXZlIHRvIHRyaWdnZXIgYSBsb2FkLlxuICAgIGlmICghdGhpcy5fc2hvdWxkU2hvd1BsYWNlaG9sZGVyKCkpIHtcbiAgICAgIHRoaXMuX2xvYWQoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wbGF5ZXJWYXJzPy5hdXRvcGxheSA9PT0gMSkge1xuICAgICAgLy8gSWYgaXQncyBhbiBhdXRvcGxheWluZyB2aWRlbywgd2UgaGF2ZSB0byBoaWRlIHRoZSBwbGFjZWhvbGRlciBhbmQgc3RhcnQgcGxheWluZy5cbiAgICAgIHRoaXMuX2xvYWQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgcGxhY2Vob2xkZXIgZWxlbWVudC4gKi9cbiAgcHJvdGVjdGVkIF9zaG91bGRTaG93UGxhY2Vob2xkZXIoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZVBsYWNlaG9sZGVyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gU2luY2Ugd2UgZG9uJ3QgbG9hZCB0aGUgQVBJIG9uIHRoZSBzZXJ2ZXIsIHdlIHNob3cgdGhlIHBsYWNlaG9sZGVyIHBlcm1hbmVudGx5LlxuICAgIGlmICghdGhpcy5faXNCcm93c2VyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5faGFzUGxhY2Vob2xkZXIgJiYgISF0aGlzLnZpZGVvSWQgJiYgIXRoaXMuX3BsYXllcjtcbiAgfVxuXG4gIC8qKiBHZXRzIGFuIG9iamVjdCB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHN0b3JlIHRoZSB0ZW1wb3JhcnkgQVBJIHN0YXRlLiAqL1xuICBwcml2YXRlIF9nZXRQZW5kaW5nU3RhdGUoKTogUGVuZGluZ1BsYXllclN0YXRlIHtcbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZSkge1xuICAgICAgdGhpcy5fcGVuZGluZ1BsYXllclN0YXRlID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBjaGFuZ2UgaW4gdGhlIGNvbXBvbmVudCBzdGF0ZVxuICAgKiByZXF1aXJlcyB0aGUgWW91VHViZSBwbGF5ZXIgdG8gYmUgcmVjcmVhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2hvdWxkUmVjcmVhdGVQbGF5ZXIoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNoYW5nZSA9XG4gICAgICBjaGFuZ2VzWyd2aWRlb0lkJ10gfHxcbiAgICAgIGNoYW5nZXNbJ3BsYXllclZhcnMnXSB8fFxuICAgICAgY2hhbmdlc1snZGlzYWJsZUNvb2tpZXMnXSB8fFxuICAgICAgY2hhbmdlc1snZGlzYWJsZVBsYWNlaG9sZGVyJ107XG4gICAgcmV0dXJuICEhY2hhbmdlICYmICFjaGFuZ2UuaXNGaXJzdENoYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgWW91VHViZSBwbGF5ZXIgYW5kIGRlc3Ryb3lzIHRoZSBleGlzdGluZyBvbmUuXG4gICAqIEBwYXJhbSBwbGF5VmlkZW8gV2hldGhlciB0byBwbGF5IHRoZSB2aWRlbyBvbmNlIGl0IGxvYWRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlUGxheWVyKHBsYXlWaWRlbzogYm9vbGVhbikge1xuICAgIHRoaXMuX3BsYXllcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuX3BlbmRpbmdQbGF5ZXI/LmRlc3Ryb3koKTtcblxuICAgIC8vIEEgcGxheWVyIGNhbid0IGJlIGNyZWF0ZWQgaWYgdGhlIEFQSSBpc24ndCBsb2FkZWQsXG4gICAgLy8gb3IgdGhlcmUgaXNuJ3QgYSB2aWRlbyBvciBwbGF5bGlzdCB0byBiZSBwbGF5ZWQuXG4gICAgaWYgKHR5cGVvZiBZVCA9PT0gJ3VuZGVmaW5lZCcgfHwgKCF0aGlzLnZpZGVvSWQgJiYgIXRoaXMucGxheWVyVmFycz8ubGlzdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbXBvcnRhbnQhIFdlIG5lZWQgdG8gY3JlYXRlIHRoZSBQbGF5ZXIgb2JqZWN0IG91dHNpZGUgb2YgdGhlIGBOZ1pvbmVgLCBiZWNhdXNlIGl0IGtpY2tzXG4gICAgLy8gb2ZmIGEgMjUwbXMgc2V0SW50ZXJ2YWwgd2hpY2ggd2lsbCBjb250aW51YWxseSB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gaWYgd2UgZG9uJ3QuXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IFlULlBsYXllcih0aGlzLnlvdXR1YmVDb250YWluZXIubmF0aXZlRWxlbWVudCwge1xuICAgICAgICAgIHZpZGVvSWQ6IHRoaXMudmlkZW9JZCxcbiAgICAgICAgICBob3N0OiB0aGlzLmRpc2FibGVDb29raWVzID8gJ2h0dHBzOi8vd3d3LnlvdXR1YmUtbm9jb29raWUuY29tJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgICAgIC8vIENhbGxpbmcgYHBsYXlWaWRlb2Agb24gbG9hZCBkb2Vzbid0IGFwcGVhciB0byBhY3R1YWxseSBwbGF5XG4gICAgICAgICAgLy8gdGhlIHZpZGVvIHNvIHdlIG5lZWQgdG8gdHJpZ2dlciBpdCB0aHJvdWdoIGBwbGF5ZXJWYXJzYCBpbnN0ZWFkLlxuICAgICAgICAgIHBsYXllclZhcnM6IHBsYXlWaWRlbyA/IHsuLi4odGhpcy5wbGF5ZXJWYXJzIHx8IHt9KSwgYXV0b3BsYXk6IDF9IDogdGhpcy5wbGF5ZXJWYXJzLFxuICAgICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3Qgd2hlblJlYWR5ID0gKCkgPT4ge1xuICAgICAgLy8gT25seSBhc3NpZ24gdGhlIHBsYXllciBvbmNlIGl0J3MgcmVhZHksIG90aGVyd2lzZSBZb3VUdWJlIGRvZXNuJ3QgZXhwb3NlIHNvbWUgQVBJcy5cbiAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faGFzUGxhY2Vob2xkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcGxheWVyID0gcGxheWVyO1xuICAgICAgICB0aGlzLl9wZW5kaW5nUGxheWVyID0gdW5kZWZpbmVkO1xuICAgICAgICBwbGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignb25SZWFkeScsIHdoZW5SZWFkeSk7XG4gICAgICAgIHRoaXMuX3BsYXllckNoYW5nZXMubmV4dChwbGF5ZXIpO1xuICAgICAgICB0aGlzLl9zZXRTaXplKCk7XG4gICAgICAgIHRoaXMuX3NldFF1YWxpdHkoKTtcblxuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1BsYXllclN0YXRlKSB7XG4gICAgICAgICAgdGhpcy5fYXBwbHlQZW5kaW5nUGxheWVyU3RhdGUocGxheWVyLCB0aGlzLl9wZW5kaW5nUGxheWVyU3RhdGUpO1xuICAgICAgICAgIHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgY3VlIHRoZSBwbGF5ZXIgd2hlbiBpdCBlaXRoZXIgaGFzbid0IHN0YXJ0ZWQgeWV0IG9yIGl0J3MgY3VlZCxcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGN1aW5nIGl0IGNhbiBpbnRlcnJ1cHQgYSBwbGF5ZXIgd2l0aCBhdXRvcGxheSBlbmFibGVkLlxuICAgICAgICBjb25zdCBzdGF0ZSA9IHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpO1xuICAgICAgICBpZiAoc3RhdGUgPT09IFBsYXllclN0YXRlLlVOU1RBUlRFRCB8fCBzdGF0ZSA9PT0gUGxheWVyU3RhdGUuQ1VFRCB8fCBzdGF0ZSA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fY3VlUGxheWVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aGlzLl9wZW5kaW5nUGxheWVyID0gcGxheWVyO1xuICAgIHBsYXllci5hZGRFdmVudExpc3RlbmVyKCdvblJlYWR5Jywgd2hlblJlYWR5KTtcbiAgfVxuXG4gIC8qKiBBcHBsaWVzIGFueSBzdGF0ZSB0aGF0IGNoYW5nZWQgYmVmb3JlIHRoZSBwbGF5ZXIgd2FzIGluaXRpYWxpemVkLiAqL1xuICBwcml2YXRlIF9hcHBseVBlbmRpbmdQbGF5ZXJTdGF0ZShwbGF5ZXI6IFlULlBsYXllciwgcGVuZGluZ1N0YXRlOiBQZW5kaW5nUGxheWVyU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCB7cGxheWJhY2tTdGF0ZSwgcGxheWJhY2tSYXRlLCB2b2x1bWUsIG11dGVkLCBzZWVrfSA9IHBlbmRpbmdTdGF0ZTtcblxuICAgIHN3aXRjaCAocGxheWJhY2tTdGF0ZSkge1xuICAgICAgY2FzZSBQbGF5ZXJTdGF0ZS5QTEFZSU5HOlxuICAgICAgICBwbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQbGF5ZXJTdGF0ZS5QQVVTRUQ6XG4gICAgICAgIHBsYXllci5wYXVzZVZpZGVvKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQbGF5ZXJTdGF0ZS5DVUVEOlxuICAgICAgICBwbGF5ZXIuc3RvcFZpZGVvKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChwbGF5YmFja1JhdGUgIT0gbnVsbCkge1xuICAgICAgcGxheWVyLnNldFBsYXliYWNrUmF0ZShwbGF5YmFja1JhdGUpO1xuICAgIH1cblxuICAgIGlmICh2b2x1bWUgIT0gbnVsbCkge1xuICAgICAgcGxheWVyLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgIH1cblxuICAgIGlmIChtdXRlZCAhPSBudWxsKSB7XG4gICAgICBtdXRlZCA/IHBsYXllci5tdXRlKCkgOiBwbGF5ZXIudW5NdXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKHNlZWsgIT0gbnVsbCkge1xuICAgICAgcGxheWVyLnNlZWtUbyhzZWVrLnNlY29uZHMsIHNlZWsuYWxsb3dTZWVrQWhlYWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDdWVzIHRoZSBwbGF5ZXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlLiAqL1xuICBwcml2YXRlIF9jdWVQbGF5ZXIoKSB7XG4gICAgaWYgKHRoaXMuX3BsYXllciAmJiB0aGlzLnZpZGVvSWQpIHtcbiAgICAgIHRoaXMuX3BsYXllci5jdWVWaWRlb0J5SWQoe1xuICAgICAgICB2aWRlb0lkOiB0aGlzLnZpZGVvSWQsXG4gICAgICAgIHN0YXJ0U2Vjb25kczogdGhpcy5zdGFydFNlY29uZHMsXG4gICAgICAgIGVuZFNlY29uZHM6IHRoaXMuZW5kU2Vjb25kcyxcbiAgICAgICAgc3VnZ2VzdGVkUXVhbGl0eTogdGhpcy5zdWdnZXN0ZWRRdWFsaXR5LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgdGhlIHBsYXllcidzIHNpemUgYmFzZWQgb24gdGhlIGN1cnJlbnQgaW5wdXQgdmFsdWVzLiAqL1xuICBwcml2YXRlIF9zZXRTaXplKCkge1xuICAgIHRoaXMuX3BsYXllcj8uc2V0U2l6ZSh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gIH1cblxuICAvKiogU2V0cyB0aGUgcGxheWVyJ3MgcXVhbGl0eSBiYXNlZCBvbiB0aGUgY3VycmVudCBpbnB1dCB2YWx1ZXMuICovXG4gIHByaXZhdGUgX3NldFF1YWxpdHkoKSB7XG4gICAgaWYgKHRoaXMuX3BsYXllciAmJiB0aGlzLnN1Z2dlc3RlZFF1YWxpdHkpIHtcbiAgICAgIHRoaXMuX3BsYXllci5zZXRQbGF5YmFja1F1YWxpdHkodGhpcy5zdWdnZXN0ZWRRdWFsaXR5KTtcbiAgICB9XG4gIH1cblxuICAvKiogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgYWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgcGxheWVyIHdoZW4gYSB1c2VyIHN1YnNjcmliZXMgdG8gaXQuICovXG4gIHByaXZhdGUgX2dldExhenlFbWl0dGVyPFQgZXh0ZW5kcyBZVC5QbGF5ZXJFdmVudD4obmFtZToga2V5b2YgWVQuRXZlbnRzKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgLy8gU3RhcnQgd2l0aCB0aGUgc3RyZWFtIG9mIHBsYXllcnMuIFRoaXMgd2F5IHRoZSBldmVudHMgd2lsbCBiZSB0cmFuc2ZlcnJlZFxuICAgIC8vIG92ZXIgdG8gdGhlIG5ldyBwbGF5ZXIgaWYgaXQgZ2V0cyBzd2FwcGVkIG91dCB1bmRlci10aGUtaG9vZC5cbiAgICByZXR1cm4gdGhpcy5fcGxheWVyQ2hhbmdlcy5waXBlKFxuICAgICAgLy8gU3dpdGNoIHRvIHRoZSBib3VuZCBldmVudC4gYHN3aXRjaE1hcGAgZW5zdXJlcyB0aGF0IHRoZSBvbGQgZXZlbnQgaXMgcmVtb3ZlZCB3aGVuIHRoZVxuICAgICAgLy8gcGxheWVyIGlzIGNoYW5nZWQuIElmIHRoZXJlJ3Mgbm8gcGxheWVyLCByZXR1cm4gYW4gb2JzZXJ2YWJsZSB0aGF0IG5ldmVyIGVtaXRzLlxuICAgICAgc3dpdGNoTWFwKHBsYXllciA9PiB7XG4gICAgICAgIHJldHVybiBwbGF5ZXJcbiAgICAgICAgICA/IGZyb21FdmVudFBhdHRlcm48VD4oXG4gICAgICAgICAgICAgIChsaXN0ZW5lcjogKGV2ZW50OiBUKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgICAgICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAobGlzdGVuZXI6IChldmVudDogVCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBBUEkgc2VlbXMgdG8gdGhyb3cgd2hlbiB3ZSB0cnkgdG8gdW5iaW5kIGZyb20gYSBkZXN0cm95ZWQgcGxheWVyIGFuZCBpdCBkb2Vzbid0XG4gICAgICAgICAgICAgICAgLy8gZXhwb3NlIHdoZXRoZXIgdGhlIHBsYXllciBoYXMgYmVlbiBkZXN0cm95ZWQgc28gd2UgaGF2ZSB0byB3cmFwIGl0IGluIGEgdHJ5L2NhdGNoIHRvXG4gICAgICAgICAgICAgICAgLy8gcHJldmVudCB0aGUgZW50aXJlIHN0cmVhbSBmcm9tIGVycm9yaW5nIG91dC5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgcGxheWVyPy5yZW1vdmVFdmVudExpc3RlbmVyPy4obmFtZSwgbGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge31cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IG9ic2VydmFibGVPZjxUPigpO1xuICAgICAgfSksXG4gICAgICAvLyBCeSBkZWZhdWx0IHdlIHJ1biBhbGwgdGhlIEFQSSBpbnRlcmFjdGlvbnMgb3V0c2lkZSB0aGUgem9uZVxuICAgICAgLy8gc28gd2UgaGF2ZSB0byBicmluZyB0aGUgZXZlbnRzIGJhY2sgaW4gbWFudWFsbHkgd2hlbiB0aGV5IGVtaXQuXG4gICAgICBzb3VyY2UgPT5cbiAgICAgICAgbmV3IE9ic2VydmFibGU8VD4ob2JzZXJ2ZXIgPT5cbiAgICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IHZhbHVlID0+IHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gb2JzZXJ2ZXIubmV4dCh2YWx1ZSkpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yID0+IG9ic2VydmVyLmVycm9yKGVycm9yKSxcbiAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiBvYnNlcnZlci5jb21wbGV0ZSgpLFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgLy8gRW5zdXJlcyB0aGF0IGV2ZXJ5dGhpbmcgaXMgY2xlYXJlZCBvdXQgb24gZGVzdHJveS5cbiAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpLFxuICAgICk7XG4gIH1cbn1cblxubGV0IGFwaUxvYWRlZCA9IGZhbHNlO1xuXG4vKiogTG9hZHMgdGhlIFlvdVR1YmUgQVBJIGZyb20gYSBzcGVjaWZpZWQgVVJMIG9ubHkgb25jZS4gKi9cbmZ1bmN0aW9uIGxvYWRBcGkobm9uY2U6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgaWYgKGFwaUxvYWRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFdlIGNhbiB1c2UgYGRvY3VtZW50YCBkaXJlY3RseSBoZXJlLCBiZWNhdXNlIHRoaXMgbG9naWMgZG9lc24ndCBydW4gb3V0c2lkZSB0aGUgYnJvd3Nlci5cbiAgY29uc3QgdXJsID0gJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2lmcmFtZV9hcGknO1xuICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgY29uc3QgY2FsbGJhY2sgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgc2NyaXB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjYWxsYmFjayk7XG4gICAgc2NyaXB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgY2FsbGJhY2spO1xuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgIGFwaUxvYWRlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBsb2FkIFlvdVR1YmUgQVBJIGZyb20gJHt1cmx9YCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNhbGxiYWNrKTtcbiAgc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgY2FsbGJhY2spO1xuICAoc2NyaXB0IGFzIGFueSkuc3JjID0gdXJsO1xuICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuXG4gIGlmIChub25jZSkge1xuICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpO1xuICB9XG5cbiAgLy8gU2V0IHRoaXMgaW1tZWRpYXRlbHkgdG8gdHJ1ZSBzbyB3ZSBkb24ndCBzdGFydCBsb2FkaW5nIGFub3RoZXIgc2NyaXB0XG4gIC8vIHdoaWxlIHRoaXMgb25lIGlzIHBlbmRpbmcuIElmIGxvYWRpbmcgZmFpbHMsIHdlJ2xsIGZsaXAgaXQgYmFjayB0byBmYWxzZS5cbiAgYXBpTG9hZGVkID0gdHJ1ZTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xufVxuIl19
602
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW91dHViZS1wbGF5ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMveW91dHViZS1wbGF5ZXIveW91dHViZS1wbGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgseUVBQXlFO0FBQ3pFLGlEQUFpRDtBQUVqRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFFTixNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sV0FBVyxFQUdYLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsY0FBYyxFQUNkLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBRWxCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLFlBQVksRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2hHLE9BQU8sRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUEwQix3QkFBd0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDOztBQVMvRiw2REFBNkQ7QUFDN0QsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQ3JELHVCQUF1QixDQUN4QixDQUFDO0FBd0JGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQUN4QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFjekMseUNBQXlDO0FBQ3pDLFNBQVMsVUFBVSxDQUFDLEtBQXlCO0lBQzNDLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxlQUFlLENB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LEVBQUUsQ0FBQyxDQUFDO1lBQzFELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLE1BQWMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQzFCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBRXBCLElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDRFQUE0RTtJQUM1RSxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gV29ya2Fyb3VuZCBmb3I6IGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL3J1bGVzX25vZGVqcy9pc3N1ZXMvMTI2NVxuLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJ5b3V0dWJlXCIgcHJlc2VydmU9XCJ0cnVlXCIgLz5cblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIEluamVjdCxcbiAgUExBVEZPUk1fSUQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgbnVtYmVyQXR0cmlidXRlLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgaW5qZWN0LFxuICBDU1BfTk9OQ0UsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBBZnRlclZpZXdJbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7aXNQbGF0Zm9ybUJyb3dzZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge09ic2VydmFibGUsIG9mIGFzIG9ic2VydmFibGVPZiwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0LCBmcm9tRXZlbnRQYXR0ZXJufSBmcm9tICdyeGpzJztcbmltcG9ydCB7dGFrZVVudGlsLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7UGxhY2Vob2xkZXJJbWFnZVF1YWxpdHksIFlvdVR1YmVQbGF5ZXJQbGFjZWhvbGRlcn0gZnJvbSAnLi95b3V0dWJlLXBsYXllci1wbGFjZWhvbGRlcic7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgWVQ6IHR5cGVvZiBZVCB8IHVuZGVmaW5lZDtcbiAgICBvbllvdVR1YmVJZnJhbWVBUElSZWFkeTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBJbmplY3Rpb24gdG9rZW4gdXNlZCB0byBjb25maWd1cmUgdGhlIGBZb3VUdWJlUGxheWVyYC4gKi9cbmV4cG9ydCBjb25zdCBZT1VUVUJFX1BMQVlFUl9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48WW91VHViZVBsYXllckNvbmZpZz4oXG4gICdZT1VUVUJFX1BMQVlFUl9DT05GSUcnLFxuKTtcblxuLyoqIE9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYFlvdVR1YmVQbGF5ZXJgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBZb3VUdWJlUGxheWVyQ29uZmlnIHtcbiAgLyoqIFdoZXRoZXIgdG8gbG9hZCB0aGUgWW91VHViZSBpZnJhbWUgQVBJIGF1dG9tYXRpY2FsbHkuIERlZmF1bHRzIHRvIGB0cnVlYC4gKi9cbiAgbG9hZEFwaT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIHBsYXllciBzaG93cyBhIHBsYWNlaG9sZGVyIGltYWdlIGluc3RlYWQgb2YgbG9hZGluZyB0aGUgWW91VHViZSBBUEkgd2hpY2hcbiAgICogaW1wcm92ZXMgdGhlIGluaXRpYWwgcGFnZSBsb2FkIHBlcmZvcm1hbmNlLiBVc2UgdGhpcyBvcHRpb24gdG8gZGlzYWJsZSB0aGUgcGxhY2Vob2xkZXIgbG9hZGluZ1xuICAgKiBiZWhhdmlvciBnbG9iYWxseS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGRpc2FibGVQbGFjZWhvbGRlcj86IGJvb2xlYW47XG5cbiAgLyoqIEFjY2Vzc2libGUgbGFiZWwgZm9yIHRoZSBwbGF5IGJ1dHRvbiBpbnNpZGUgb2YgdGhlIHBsYWNlaG9sZGVyLiAqL1xuICBwbGFjZWhvbGRlckJ1dHRvbkxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBRdWFsaXR5IG9mIHRoZSBkaXNwbGF5ZWQgcGxhY2Vob2xkZXIgaW1hZ2UuIERlZmF1bHRzIHRvIGBzdGFuZGFyZGAsXG4gICAqIGJlY2F1c2Ugbm90IGFsbCB2aWRlbyBoYXZlIGEgaGlnaC1xdWFsaXR5IHBsYWNlaG9sZGVyLlxuICAgKi9cbiAgcGxhY2Vob2xkZXJJbWFnZVF1YWxpdHk/OiBQbGFjZWhvbGRlckltYWdlUXVhbGl0eTtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUExBWUVSX1dJRFRIID0gNjQwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUExBWUVSX0hFSUdIVCA9IDM5MDtcblxuLyoqXG4gKiBPYmplY3QgdXNlZCB0byBzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIHBsYXllciBpZiB0aGVcbiAqIHVzZXIgdHJpZXMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgQVBJIGJlZm9yZSBpdCBoYXMgYmVlbiBsb2FkZWQuXG4gKi9cbmludGVyZmFjZSBQZW5kaW5nUGxheWVyU3RhdGUge1xuICBwbGF5YmFja1N0YXRlPzogUGxheWVyU3RhdGUuUExBWUlORyB8IFBsYXllclN0YXRlLlBBVVNFRCB8IFBsYXllclN0YXRlLkNVRUQ7XG4gIHBsYXliYWNrUmF0ZT86IG51bWJlcjtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBtdXRlZD86IGJvb2xlYW47XG4gIHNlZWs/OiB7c2Vjb25kczogbnVtYmVyOyBhbGxvd1NlZWtBaGVhZDogYm9vbGVhbn07XG59XG5cbi8qKiBDb2VyY2lvbiBmdW5jdGlvbiBmb3IgdGltZSB2YWx1ZXMuICovXG5mdW5jdGlvbiBjb2VyY2VUaW1lKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHZhbHVlIDogbnVtYmVyQXR0cmlidXRlKHZhbHVlLCAwKTtcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IG9mIGBZVC5QbGF5ZXJTdGF0ZWAgd2hpY2ggd2UgY2FuJ3QgdXNlLCBiZWNhdXNlIGl0J3MgbWVhbnQgdG9cbiAqIGJlIHJlYWQgb2ZmIHRoZSBgd2luZG93YCB3aGljaCB3ZSBjYW4ndCBkbyBiZWZvcmUgdGhlIEFQSSBoYXMgYmVlbiBsb2FkZWQuXG4gKi9cbmVudW0gUGxheWVyU3RhdGUge1xuICBVTlNUQVJURUQgPSAtMSxcbiAgRU5ERUQgPSAwLFxuICBQTEFZSU5HID0gMSxcbiAgUEFVU0VEID0gMixcbiAgQlVGRkVSSU5HID0gMyxcbiAgQ1VFRCA9IDUsXG59XG5cbi8qKlxuICogQW5ndWxhciBjb21wb25lbnQgdGhhdCByZW5kZXJzIGEgWW91VHViZSBwbGF5ZXIgdmlhIHRoZSBZb3VUdWJlIHBsYXllclxuICogaWZyYW1lIEFQSS5cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd5b3V0dWJlLXBsYXllcicsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbWW91VHViZVBsYXllclBsYWNlaG9sZGVyXSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKF9zaG91bGRTaG93UGxhY2Vob2xkZXIoKSkge1xuICAgICAgPHlvdXR1YmUtcGxheWVyLXBsYWNlaG9sZGVyXG4gICAgICAgIFt2aWRlb0lkXT1cInZpZGVvSWQhXCJcbiAgICAgICAgW3dpZHRoXT1cIndpZHRoXCJcbiAgICAgICAgW2hlaWdodF09XCJoZWlnaHRcIlxuICAgICAgICBbaXNMb2FkaW5nXT1cIl9pc0xvYWRpbmdcIlxuICAgICAgICBbYnV0dG9uTGFiZWxdPVwicGxhY2Vob2xkZXJCdXR0b25MYWJlbFwiXG4gICAgICAgIFtxdWFsaXR5XT1cInBsYWNlaG9sZGVySW1hZ2VRdWFsaXR5XCJcbiAgICAgICAgKGNsaWNrKT1cIl9sb2FkKHRydWUpXCIvPlxuICAgIH1cbiAgICA8ZGl2IFtzdHlsZS5kaXNwbGF5XT1cIl9zaG91bGRTaG93UGxhY2Vob2xkZXIoKSA/ICdub25lJyA6ICcnXCI+XG4gICAgICA8ZGl2ICN5b3V0dWJlQ29udGFpbmVyPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBZb3VUdWJlUGxheWVyIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKiogV2hldGhlciB3ZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nIGluc2lkZSBhIGJyb3dzZXIuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lzQnJvd3NlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfcGxheWVyOiBZVC5QbGF5ZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3BlbmRpbmdQbGF5ZXI6IFlULlBsYXllciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfZXhpc3RpbmdBcGlSZWFkeUNhbGxiYWNrOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3BlbmRpbmdQbGF5ZXJTdGF0ZTogUGVuZGluZ1BsYXllclN0YXRlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wbGF5ZXJDaGFuZ2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxZVC5QbGF5ZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX25vbmNlID0gaW5qZWN0KENTUF9OT05DRSwge29wdGlvbmFsOiB0cnVlfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5nZURldGVjdG9yUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJvdGVjdGVkIF9pc0xvYWRpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9oYXNQbGFjZWhvbGRlciA9IHRydWU7XG5cbiAgLyoqIFlvdVR1YmUgVmlkZW8gSUQgdG8gdmlldyAqL1xuICBASW5wdXQoKVxuICB2aWRlb0lkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIEhlaWdodCBvZiB2aWRlbyBwbGF5ZXIgKi9cbiAgQElucHV0KHt0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZX0pXG4gIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICB9XG4gIHNldCBoZWlnaHQoaGVpZ2h0OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQgPT0gbnVsbCB8fCBpc05hTihoZWlnaHQpID8gREVGQVVMVF9QTEFZRVJfSEVJR0hUIDogaGVpZ2h0O1xuICB9XG4gIHByaXZhdGUgX2hlaWdodCA9IERFRkFVTFRfUExBWUVSX0hFSUdIVDtcblxuICAvKiogV2lkdGggb2YgdmlkZW8gcGxheWVyICovXG4gIEBJbnB1dCh7dHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGV9KVxuICBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gIH1cbiAgc2V0IHdpZHRoKHdpZHRoOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl93aWR0aCA9IHdpZHRoID09IG51bGwgfHwgaXNOYU4od2lkdGgpID8gREVGQVVMVF9QTEFZRVJfV0lEVEggOiB3aWR0aDtcbiAgfVxuICBwcml2YXRlIF93aWR0aCA9IERFRkFVTFRfUExBWUVSX1dJRFRIO1xuXG4gIC8qKiBUaGUgbW9tZW50IHdoZW4gdGhlIHBsYXllciBpcyBzdXBwb3NlZCB0byBzdGFydCBwbGF5aW5nICovXG4gIEBJbnB1dCh7dHJhbnNmb3JtOiBjb2VyY2VUaW1lfSlcbiAgc3RhcnRTZWNvbmRzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBtb21lbnQgd2hlbiB0aGUgcGxheWVyIGlzIHN1cHBvc2VkIHRvIHN0b3AgcGxheWluZyAqL1xuICBASW5wdXQoe3RyYW5zZm9ybTogY29lcmNlVGltZX0pXG4gIGVuZFNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIHN1Z2dlc3RlZCBxdWFsaXR5IG9mIHRoZSBwbGF5ZXIgKi9cbiAgQElucHV0KClcbiAgc3VnZ2VzdGVkUXVhbGl0eTogWVQuU3VnZ2VzdGVkVmlkZW9RdWFsaXR5IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBFeHRyYSBwYXJhbWV0ZXJzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBwbGF5ZXIuIFNlZTpcbiAgICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9wbGF5ZXJfcGFyYW1ldGVycy5odG1sP3BsYXllclZlcnNpb249SFRNTDUjUGFyYW1ldGVyc1xuICAgKi9cbiAgQElucHV0KClcbiAgcGxheWVyVmFyczogWVQuUGxheWVyVmFycyB8IHVuZGVmaW5lZDtcblxuICAvKiogV2hldGhlciBjb29raWVzIGluc2lkZSB0aGUgcGxheWVyIGhhdmUgYmVlbiBkaXNhYmxlZC4gKi9cbiAgQElucHV0KHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KVxuICBkaXNhYmxlQ29va2llczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgbG9hZCB0aGUgWW91VHViZSBpZnJhbWUgQVBJLiBEZWZhdWx0cyB0byBgdHJ1ZWAuICovXG4gIEBJbnB1dCh7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSlcbiAgbG9hZEFwaTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgcGxheWVyIHNob3dzIGEgcGxhY2Vob2xkZXIgaW1hZ2UgaW5zdGVhZCBvZiBsb2FkaW5nIHRoZSBZb3VUdWJlIEFQSSB3aGljaFxuICAgKiBpbXByb3ZlcyB0aGUgaW5pdGlhbCBwYWdlIGxvYWQgcGVyZm9ybWFuY2UuIFRoaXMgaW5wdXQgYWxsb3dzIGZvciB0aGUgYmVoYXZpb3IgdG8gYmUgZGlzYWJsZWQuXG4gICAqL1xuICBASW5wdXQoe3RyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZX0pXG4gIGRpc2FibGVQbGFjZWhvbGRlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBpZnJhbWUgd2lsbCBhdHRlbXB0IHRvIGxvYWQgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzIG9mIHRoZSBhcGkgb24gdGhlXG4gICAqIHBhZ2UuIFNldCB0aGlzIHRvIHRydWUgaWYgeW91IGRvbid0IHdhbnQgdGhlIGBvbllvdVR1YmVJZnJhbWVBUElSZWFkeWAgZmllbGQgdG8gYmVcbiAgICogc2V0IG9uIHRoZSBnbG9iYWwgd2luZG93LlxuICAgKi9cbiAgQElucHV0KHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KSBzaG93QmVmb3JlSWZyYW1lQXBpTG9hZHM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogQWNjZXNzaWJsZSBsYWJlbCBmb3IgdGhlIHBsYXkgYnV0dG9uIGluc2lkZSBvZiB0aGUgcGxhY2Vob2xkZXIuICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyQnV0dG9uTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogUXVhbGl0eSBvZiB0aGUgZGlzcGxheWVkIHBsYWNlaG9sZGVyIGltYWdlLiBEZWZhdWx0cyB0byBgc3RhbmRhcmRgLFxuICAgKiBiZWNhdXNlIG5vdCBhbGwgdmlkZW8gaGF2ZSBhIGhpZ2gtcXVhbGl0eSBwbGFjZWhvbGRlci5cbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVySW1hZ2VRdWFsaXR5OiBQbGFjZWhvbGRlckltYWdlUXVhbGl0eTtcblxuICAvKiogT3V0cHV0cyBhcmUgZGlyZWN0IHByb3hpZXMgZnJvbSB0aGUgcGxheWVyIGl0c2VsZi4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHJlYWR5OiBPYnNlcnZhYmxlPFlULlBsYXllckV2ZW50PiA9XG4gICAgdGhpcy5fZ2V0TGF6eUVtaXR0ZXI8WVQuUGxheWVyRXZlbnQ+KCdvblJlYWR5Jyk7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHN0YXRlQ2hhbmdlOiBPYnNlcnZhYmxlPFlULk9uU3RhdGVDaGFuZ2VFdmVudD4gPVxuICAgIHRoaXMuX2dldExhenlFbWl0dGVyPFlULk9uU3RhdGVDaGFuZ2VFdmVudD4oJ29uU3RhdGVDaGFuZ2UnKTtcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgZXJyb3I6IE9ic2VydmFibGU8WVQuT25FcnJvckV2ZW50PiA9XG4gICAgdGhpcy5fZ2V0TGF6eUVtaXR0ZXI8WVQuT25FcnJvckV2ZW50Pignb25FcnJvcicpO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBhcGlDaGFuZ2U6IE9ic2VydmFibGU8WVQuUGxheWVyRXZlbnQ+ID1cbiAgICB0aGlzLl9nZXRMYXp5RW1pdHRlcjxZVC5QbGF5ZXJFdmVudD4oJ29uQXBpQ2hhbmdlJyk7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHBsYXliYWNrUXVhbGl0eUNoYW5nZTogT2JzZXJ2YWJsZTxZVC5PblBsYXliYWNrUXVhbGl0eUNoYW5nZUV2ZW50PiA9XG4gICAgdGhpcy5fZ2V0TGF6eUVtaXR0ZXI8WVQuT25QbGF5YmFja1F1YWxpdHlDaGFuZ2VFdmVudD4oJ29uUGxheWJhY2tRdWFsaXR5Q2hhbmdlJyk7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHBsYXliYWNrUmF0ZUNoYW5nZTogT2JzZXJ2YWJsZTxZVC5PblBsYXliYWNrUmF0ZUNoYW5nZUV2ZW50PiA9XG4gICAgdGhpcy5fZ2V0TGF6eUVtaXR0ZXI8WVQuT25QbGF5YmFja1JhdGVDaGFuZ2VFdmVudD4oJ29uUGxheWJhY2tSYXRlQ2hhbmdlJyk7XG5cbiAgLyoqIFRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgaWZyYW1lLiAqL1xuICBAVmlld0NoaWxkKCd5b3V0dWJlQ29udGFpbmVyJywge3N0YXRpYzogdHJ1ZX0pXG4gIHlvdXR1YmVDb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgKSB7XG4gICAgY29uc3QgY29uZmlnID0gaW5qZWN0KFlPVVRVQkVfUExBWUVSX0NPTkZJRywge29wdGlvbmFsOiB0cnVlfSk7XG4gICAgdGhpcy5sb2FkQXBpID0gY29uZmlnPy5sb2FkQXBpID8/IHRydWU7XG4gICAgdGhpcy5kaXNhYmxlUGxhY2Vob2xkZXIgPSAhIWNvbmZpZz8uZGlzYWJsZVBsYWNlaG9sZGVyO1xuICAgIHRoaXMucGxhY2Vob2xkZXJCdXR0b25MYWJlbCA9IGNvbmZpZz8ucGxhY2Vob2xkZXJCdXR0b25MYWJlbCB8fCAnUGxheSB2aWRlbyc7XG4gICAgdGhpcy5wbGFjZWhvbGRlckltYWdlUXVhbGl0eSA9IGNvbmZpZz8ucGxhY2Vob2xkZXJJbWFnZVF1YWxpdHkgfHwgJ3N0YW5kYXJkJztcbiAgICB0aGlzLl9pc0Jyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9jb25kaXRpb25hbGx5TG9hZCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zaG91bGRSZWNyZWF0ZVBsYXllcihjaGFuZ2VzKSkge1xuICAgICAgdGhpcy5fY29uZGl0aW9uYWxseUxvYWQoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgaWYgKGNoYW5nZXNbJ3dpZHRoJ10gfHwgY2hhbmdlc1snaGVpZ2h0J10pIHtcbiAgICAgICAgdGhpcy5fc2V0U2l6ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlc1snc3VnZ2VzdGVkUXVhbGl0eSddKSB7XG4gICAgICAgIHRoaXMuX3NldFF1YWxpdHkoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZXNbJ3N0YXJ0U2Vjb25kcyddIHx8IGNoYW5nZXNbJ2VuZFNlY29uZHMnXSB8fCBjaGFuZ2VzWydzdWdnZXN0ZWRRdWFsaXR5J10pIHtcbiAgICAgICAgdGhpcy5fY3VlUGxheWVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fcGVuZGluZ1BsYXllcj8uZGVzdHJveSgpO1xuXG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgdGhpcy5fcGxheWVyLmRlc3Ryb3koKTtcbiAgICAgIHdpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeSA9IHRoaXMuX2V4aXN0aW5nQXBpUmVhZHlDYWxsYmFjaztcbiAgICB9XG5cbiAgICB0aGlzLl9wbGF5ZXJDaGFuZ2VzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNwbGF5VmlkZW8gKi9cbiAgcGxheVZpZGVvKCkge1xuICAgIGlmICh0aGlzLl9wbGF5ZXIpIHtcbiAgICAgIHRoaXMuX3BsYXllci5wbGF5VmlkZW8oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZ2V0UGVuZGluZ1N0YXRlKCkucGxheWJhY2tTdGF0ZSA9IFBsYXllclN0YXRlLlBMQVlJTkc7XG4gICAgICB0aGlzLl9sb2FkKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNwYXVzZVZpZGVvICovXG4gIHBhdXNlVmlkZW8oKSB7XG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgdGhpcy5fcGxheWVyLnBhdXNlVmlkZW8oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZ2V0UGVuZGluZ1N0YXRlKCkucGxheWJhY2tTdGF0ZSA9IFBsYXllclN0YXRlLlBBVVNFRDtcbiAgICB9XG4gIH1cblxuICAvKiogU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvaWZyYW1lX2FwaV9yZWZlcmVuY2Ujc3RvcFZpZGVvICovXG4gIHN0b3BWaWRlbygpIHtcbiAgICBpZiAodGhpcy5fcGxheWVyKSB7XG4gICAgICB0aGlzLl9wbGF5ZXIuc3RvcFZpZGVvKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEl0IHNlZW1zIGxpa2UgWW91VHViZSBzZXRzIHRoZSBwbGF5ZXIgdG8gQ1VFRCB3aGVuIGl0J3Mgc3RvcHBlZC5cbiAgICAgIHRoaXMuX2dldFBlbmRpbmdTdGF0ZSgpLnBsYXliYWNrU3RhdGUgPSBQbGF5ZXJTdGF0ZS5DVUVEO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNzZWVrVG8gKi9cbiAgc2Vla1RvKHNlY29uZHM6IG51bWJlciwgYWxsb3dTZWVrQWhlYWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5fcGxheWVyKSB7XG4gICAgICB0aGlzLl9wbGF5ZXIuc2Vla1RvKHNlY29uZHMsIGFsbG93U2Vla0FoZWFkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZ2V0UGVuZGluZ1N0YXRlKCkuc2VlayA9IHtzZWNvbmRzLCBhbGxvd1NlZWtBaGVhZH07XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS95b3V0dWJlL2lmcmFtZV9hcGlfcmVmZXJlbmNlI211dGUgKi9cbiAgbXV0ZSgpIHtcbiAgICBpZiAodGhpcy5fcGxheWVyKSB7XG4gICAgICB0aGlzLl9wbGF5ZXIubXV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9nZXRQZW5kaW5nU3RhdGUoKS5tdXRlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS95b3V0dWJlL2lmcmFtZV9hcGlfcmVmZXJlbmNlI3VuTXV0ZSAqL1xuICB1bk11dGUoKSB7XG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgdGhpcy5fcGxheWVyLnVuTXV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9nZXRQZW5kaW5nU3RhdGUoKS5tdXRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNpc011dGVkICovXG4gIGlzTXV0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgcmV0dXJuIHRoaXMuX3BsYXllci5pc011dGVkKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZSkge1xuICAgICAgcmV0dXJuICEhdGhpcy5fcGVuZGluZ1BsYXllclN0YXRlLm11dGVkO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNzZXRWb2x1bWUgKi9cbiAgc2V0Vm9sdW1lKHZvbHVtZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgdGhpcy5fcGxheWVyLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9nZXRQZW5kaW5nU3RhdGUoKS52b2x1bWUgPSB2b2x1bWU7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS95b3V0dWJlL2lmcmFtZV9hcGlfcmVmZXJlbmNlI2dldFZvbHVtZSAqL1xuICBnZXRWb2x1bWUoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fcGxheWVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGxheWVyLmdldFZvbHVtZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9wZW5kaW5nUGxheWVyU3RhdGUgJiYgdGhpcy5fcGVuZGluZ1BsYXllclN0YXRlLnZvbHVtZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGVuZGluZ1BsYXllclN0YXRlLnZvbHVtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNzZXRQbGF5YmFja1JhdGUgKi9cbiAgc2V0UGxheWJhY2tSYXRlKHBsYXliYWNrUmF0ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgcmV0dXJuIHRoaXMuX3BsYXllci5zZXRQbGF5YmFja1JhdGUocGxheWJhY2tSYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZ2V0UGVuZGluZ1N0YXRlKCkucGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNnZXRQbGF5YmFja1JhdGUgKi9cbiAgZ2V0UGxheWJhY2tSYXRlKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgcmV0dXJuIHRoaXMuX3BsYXllci5nZXRQbGF5YmFja1JhdGUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGVuZGluZ1BsYXllclN0YXRlICYmIHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZS5wbGF5YmFja1JhdGUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZS5wbGF5YmFja1JhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKiogU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvaWZyYW1lX2FwaV9yZWZlcmVuY2UjZ2V0QXZhaWxhYmxlUGxheWJhY2tSYXRlcyAqL1xuICBnZXRBdmFpbGFibGVQbGF5YmFja1JhdGVzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fcGxheWVyID8gdGhpcy5fcGxheWVyLmdldEF2YWlsYWJsZVBsYXliYWNrUmF0ZXMoKSA6IFtdO1xuICB9XG5cbiAgLyoqIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS95b3V0dWJlL2lmcmFtZV9hcGlfcmVmZXJlbmNlI2dldFZpZGVvTG9hZGVkRnJhY3Rpb24gKi9cbiAgZ2V0VmlkZW9Mb2FkZWRGcmFjdGlvbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9wbGF5ZXIgPyB0aGlzLl9wbGF5ZXIuZ2V0VmlkZW9Mb2FkZWRGcmFjdGlvbigpIDogMDtcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNnZXRQbGF5ZXJTdGF0ZSAqL1xuICBnZXRQbGF5ZXJTdGF0ZSgpOiBZVC5QbGF5ZXJTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9pc0Jyb3dzZXIgfHwgIXdpbmRvdy5ZVCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGxheWVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGxheWVyLmdldFBsYXllclN0YXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZSAmJiB0aGlzLl9wZW5kaW5nUGxheWVyU3RhdGUucGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGVuZGluZ1BsYXllclN0YXRlLnBsYXliYWNrU3RhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIFBsYXllclN0YXRlLlVOU1RBUlRFRDtcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNnZXRDdXJyZW50VGltZSAqL1xuICBnZXRDdXJyZW50VGltZSgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLl9wbGF5ZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGVuZGluZ1BsYXllclN0YXRlICYmIHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZS5zZWVrKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGVuZGluZ1BsYXllclN0YXRlLnNlZWsuc2Vjb25kcztcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNnZXRQbGF5YmFja1F1YWxpdHkgKi9cbiAgZ2V0UGxheWJhY2tRdWFsaXR5KCk6IFlULlN1Z2dlc3RlZFZpZGVvUXVhbGl0eSB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYXllciA/IHRoaXMuX3BsYXllci5nZXRQbGF5YmFja1F1YWxpdHkoKSA6ICdkZWZhdWx0JztcbiAgfVxuXG4gIC8qKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20veW91dHViZS9pZnJhbWVfYXBpX3JlZmVyZW5jZSNnZXRBdmFpbGFibGVRdWFsaXR5TGV2ZWxzICovXG4gIGdldEF2YWlsYWJsZVF1YWxpdHlMZXZlbHMoKTogWVQuU3VnZ2VzdGVkVmlkZW9RdWFsaXR5W10ge1xuICAgIHJldHVybiB0aGlzLl9wbGF5ZXIgPyB0aGlzLl9wbGF5ZXIuZ2V0QXZhaWxhYmxlUXVhbGl0eUxldmVscygpIDogW107XG4gIH1cblxuICAvKiogU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvaWZyYW1lX2FwaV9yZWZlcmVuY2UjZ2V0RHVyYXRpb24gKi9cbiAgZ2V0RHVyYXRpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGxheWVyID8gdGhpcy5fcGxheWVyLmdldER1cmF0aW9uKCkgOiAwO1xuICB9XG5cbiAgLyoqIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS95b3V0dWJlL2lmcmFtZV9hcGlfcmVmZXJlbmNlI2dldFZpZGVvVXJsICovXG4gIGdldFZpZGVvVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYXllciA/IHRoaXMuX3BsYXllci5nZXRWaWRlb1VybCgpIDogJyc7XG4gIH1cblxuICAvKiogU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvaWZyYW1lX2FwaV9yZWZlcmVuY2UjZ2V0VmlkZW9FbWJlZENvZGUgKi9cbiAgZ2V0VmlkZW9FbWJlZENvZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGxheWVyID8gdGhpcy5fcGxheWVyLmdldFZpZGVvRW1iZWRDb2RlKCkgOiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgWW91VHViZSBBUEkgYW5kIHNldHMgdXAgdGhlIHBsYXllci5cbiAgICogQHBhcmFtIHBsYXlWaWRlbyBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgcGxheSB0aGUgdmlkZW8gb25jZSB0aGUgcGxheWVyIGlzIGxvYWRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfbG9hZChwbGF5VmlkZW86IGJvb2xlYW4pIHtcbiAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSdyZSBub3QgaW4gYSBicm93c2VyIGVudmlyb25tZW50LlxuICAgIGlmICghdGhpcy5faXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF3aW5kb3cuWVQgfHwgIXdpbmRvdy5ZVC5QbGF5ZXIpIHtcbiAgICAgIGlmICh0aGlzLmxvYWRBcGkpIHtcbiAgICAgICAgdGhpcy5faXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgbG9hZEFwaSh0aGlzLl9ub25jZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2hvd0JlZm9yZUlmcmFtZUFwaUxvYWRzICYmICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnTmFtZXNwYWNlIFlUIG5vdCBmb3VuZCwgY2Fubm90IGNvbnN0cnVjdCBlbWJlZGRlZCB5b3V0dWJlIHBsYXllci4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIGluc3RhbGwgdGhlIFlvdVR1YmUgUGxheWVyIEFQSSBSZWZlcmVuY2UgZm9yIGlmcmFtZSBFbWJlZHM6ICcgK1xuICAgICAgICAgICAgJ2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvaWZyYW1lX2FwaV9yZWZlcmVuY2UnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9leGlzdGluZ0FwaVJlYWR5Q2FsbGJhY2sgPSB3aW5kb3cub25Zb3VUdWJlSWZyYW1lQVBJUmVhZHk7XG5cbiAgICAgIHdpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fZXhpc3RpbmdBcGlSZWFkeUNhbGxiYWNrPy4oKTtcbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLl9jcmVhdGVQbGF5ZXIocGxheVZpZGVvKSk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jcmVhdGVQbGF5ZXIocGxheVZpZGVvKTtcbiAgICB9XG4gIH1cblxuICAvKiogTG9hZHMgdGhlIHBsYXllciBkZXBlbmRpbmcgb24gdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb21wb25lbnQuICovXG4gIHByaXZhdGUgX2NvbmRpdGlvbmFsbHlMb2FkKCkge1xuICAgIC8vIElmIHRoZSBwbGFjZWhvbGRlciBpc24ndCBzaG93biBhbnltb3JlLCB3ZSBoYXZlIHRvIHRyaWdnZXIgYSBsb2FkLlxuICAgIGlmICghdGhpcy5fc2hvdWxkU2hvd1BsYWNlaG9sZGVyKCkpIHtcbiAgICAgIHRoaXMuX2xvYWQoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wbGF5ZXJWYXJzPy5hdXRvcGxheSA9PT0gMSkge1xuICAgICAgLy8gSWYgaXQncyBhbiBhdXRvcGxheWluZyB2aWRlbywgd2UgaGF2ZSB0byBoaWRlIHRoZSBwbGFjZWhvbGRlciBhbmQgc3RhcnQgcGxheWluZy5cbiAgICAgIHRoaXMuX2xvYWQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgcGxhY2Vob2xkZXIgZWxlbWVudC4gKi9cbiAgcHJvdGVjdGVkIF9zaG91bGRTaG93UGxhY2Vob2xkZXIoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZVBsYWNlaG9sZGVyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gU2luY2Ugd2UgZG9uJ3QgbG9hZCB0aGUgQVBJIG9uIHRoZSBzZXJ2ZXIsIHdlIHNob3cgdGhlIHBsYWNlaG9sZGVyIHBlcm1hbmVudGx5LlxuICAgIGlmICghdGhpcy5faXNCcm93c2VyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5faGFzUGxhY2Vob2xkZXIgJiYgISF0aGlzLnZpZGVvSWQgJiYgIXRoaXMuX3BsYXllcjtcbiAgfVxuXG4gIC8qKiBHZXRzIGFuIG9iamVjdCB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHN0b3JlIHRoZSB0ZW1wb3JhcnkgQVBJIHN0YXRlLiAqL1xuICBwcml2YXRlIF9nZXRQZW5kaW5nU3RhdGUoKTogUGVuZGluZ1BsYXllclN0YXRlIHtcbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZSkge1xuICAgICAgdGhpcy5fcGVuZGluZ1BsYXllclN0YXRlID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBjaGFuZ2UgaW4gdGhlIGNvbXBvbmVudCBzdGF0ZVxuICAgKiByZXF1aXJlcyB0aGUgWW91VHViZSBwbGF5ZXIgdG8gYmUgcmVjcmVhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2hvdWxkUmVjcmVhdGVQbGF5ZXIoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNoYW5nZSA9XG4gICAgICBjaGFuZ2VzWyd2aWRlb0lkJ10gfHxcbiAgICAgIGNoYW5nZXNbJ3BsYXllclZhcnMnXSB8fFxuICAgICAgY2hhbmdlc1snZGlzYWJsZUNvb2tpZXMnXSB8fFxuICAgICAgY2hhbmdlc1snZGlzYWJsZVBsYWNlaG9sZGVyJ107XG4gICAgcmV0dXJuICEhY2hhbmdlICYmICFjaGFuZ2UuaXNGaXJzdENoYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgWW91VHViZSBwbGF5ZXIgYW5kIGRlc3Ryb3lzIHRoZSBleGlzdGluZyBvbmUuXG4gICAqIEBwYXJhbSBwbGF5VmlkZW8gV2hldGhlciB0byBwbGF5IHRoZSB2aWRlbyBvbmNlIGl0IGxvYWRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlUGxheWVyKHBsYXlWaWRlbzogYm9vbGVhbikge1xuICAgIHRoaXMuX3BsYXllcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuX3BlbmRpbmdQbGF5ZXI/LmRlc3Ryb3koKTtcblxuICAgIC8vIEEgcGxheWVyIGNhbid0IGJlIGNyZWF0ZWQgaWYgdGhlIEFQSSBpc24ndCBsb2FkZWQsXG4gICAgLy8gb3IgdGhlcmUgaXNuJ3QgYSB2aWRlbyBvciBwbGF5bGlzdCB0byBiZSBwbGF5ZWQuXG4gICAgaWYgKHR5cGVvZiBZVCA9PT0gJ3VuZGVmaW5lZCcgfHwgKCF0aGlzLnZpZGVvSWQgJiYgIXRoaXMucGxheWVyVmFycz8ubGlzdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbXBvcnRhbnQhIFdlIG5lZWQgdG8gY3JlYXRlIHRoZSBQbGF5ZXIgb2JqZWN0IG91dHNpZGUgb2YgdGhlIGBOZ1pvbmVgLCBiZWNhdXNlIGl0IGtpY2tzXG4gICAgLy8gb2ZmIGEgMjUwbXMgc2V0SW50ZXJ2YWwgd2hpY2ggd2lsbCBjb250aW51YWxseSB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gaWYgd2UgZG9uJ3QuXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IFlULlBsYXllcih0aGlzLnlvdXR1YmVDb250YWluZXIubmF0aXZlRWxlbWVudCwge1xuICAgICAgICAgIHZpZGVvSWQ6IHRoaXMudmlkZW9JZCxcbiAgICAgICAgICBob3N0OiB0aGlzLmRpc2FibGVDb29raWVzID8gJ2h0dHBzOi8vd3d3LnlvdXR1YmUtbm9jb29raWUuY29tJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgICAgIC8vIENhbGxpbmcgYHBsYXlWaWRlb2Agb24gbG9hZCBkb2Vzbid0IGFwcGVhciB0byBhY3R1YWxseSBwbGF5XG4gICAgICAgICAgLy8gdGhlIHZpZGVvIHNvIHdlIG5lZWQgdG8gdHJpZ2dlciBpdCB0aHJvdWdoIGBwbGF5ZXJWYXJzYCBpbnN0ZWFkLlxuICAgICAgICAgIHBsYXllclZhcnM6IHBsYXlWaWRlbyA/IHsuLi4odGhpcy5wbGF5ZXJWYXJzIHx8IHt9KSwgYXV0b3BsYXk6IDF9IDogdGhpcy5wbGF5ZXJWYXJzLFxuICAgICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3Qgd2hlblJlYWR5ID0gKCkgPT4ge1xuICAgICAgLy8gT25seSBhc3NpZ24gdGhlIHBsYXllciBvbmNlIGl0J3MgcmVhZHksIG90aGVyd2lzZSBZb3VUdWJlIGRvZXNuJ3QgZXhwb3NlIHNvbWUgQVBJcy5cbiAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faGFzUGxhY2Vob2xkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcGxheWVyID0gcGxheWVyO1xuICAgICAgICB0aGlzLl9wZW5kaW5nUGxheWVyID0gdW5kZWZpbmVkO1xuICAgICAgICBwbGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignb25SZWFkeScsIHdoZW5SZWFkeSk7XG4gICAgICAgIHRoaXMuX3BsYXllckNoYW5nZXMubmV4dChwbGF5ZXIpO1xuICAgICAgICB0aGlzLl9zZXRTaXplKCk7XG4gICAgICAgIHRoaXMuX3NldFF1YWxpdHkoKTtcblxuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1BsYXllclN0YXRlKSB7XG4gICAgICAgICAgdGhpcy5fYXBwbHlQZW5kaW5nUGxheWVyU3RhdGUocGxheWVyLCB0aGlzLl9wZW5kaW5nUGxheWVyU3RhdGUpO1xuICAgICAgICAgIHRoaXMuX3BlbmRpbmdQbGF5ZXJTdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgY3VlIHRoZSBwbGF5ZXIgd2hlbiBpdCBlaXRoZXIgaGFzbid0IHN0YXJ0ZWQgeWV0IG9yIGl0J3MgY3VlZCxcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGN1aW5nIGl0IGNhbiBpbnRlcnJ1cHQgYSBwbGF5ZXIgd2l0aCBhdXRvcGxheSBlbmFibGVkLlxuICAgICAgICBjb25zdCBzdGF0ZSA9IHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpO1xuICAgICAgICBpZiAoc3RhdGUgPT09IFBsYXllclN0YXRlLlVOU1RBUlRFRCB8fCBzdGF0ZSA9PT0gUGxheWVyU3RhdGUuQ1VFRCB8fCBzdGF0ZSA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fY3VlUGxheWVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aGlzLl9wZW5kaW5nUGxheWVyID0gcGxheWVyO1xuICAgIHBsYXllci5hZGRFdmVudExpc3RlbmVyKCdvblJlYWR5Jywgd2hlblJlYWR5KTtcbiAgfVxuXG4gIC8qKiBBcHBsaWVzIGFueSBzdGF0ZSB0aGF0IGNoYW5nZWQgYmVmb3JlIHRoZSBwbGF5ZXIgd2FzIGluaXRpYWxpemVkLiAqL1xuICBwcml2YXRlIF9hcHBseVBlbmRpbmdQbGF5ZXJTdGF0ZShwbGF5ZXI6IFlULlBsYXllciwgcGVuZGluZ1N0YXRlOiBQZW5kaW5nUGxheWVyU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCB7cGxheWJhY2tTdGF0ZSwgcGxheWJhY2tSYXRlLCB2b2x1bWUsIG11dGVkLCBzZWVrfSA9IHBlbmRpbmdTdGF0ZTtcblxuICAgIHN3aXRjaCAocGxheWJhY2tTdGF0ZSkge1xuICAgICAgY2FzZSBQbGF5ZXJTdGF0ZS5QTEFZSU5HOlxuICAgICAgICBwbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQbGF5ZXJTdGF0ZS5QQVVTRUQ6XG4gICAgICAgIHBsYXllci5wYXVzZVZpZGVvKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQbGF5ZXJTdGF0ZS5DVUVEOlxuICAgICAgICBwbGF5ZXIuc3RvcFZpZGVvKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChwbGF5YmFja1JhdGUgIT0gbnVsbCkge1xuICAgICAgcGxheWVyLnNldFBsYXliYWNrUmF0ZShwbGF5YmFja1JhdGUpO1xuICAgIH1cblxuICAgIGlmICh2b2x1bWUgIT0gbnVsbCkge1xuICAgICAgcGxheWVyLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgIH1cblxuICAgIGlmIChtdXRlZCAhPSBudWxsKSB7XG4gICAgICBtdXRlZCA/IHBsYXllci5tdXRlKCkgOiBwbGF5ZXIudW5NdXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKHNlZWsgIT0gbnVsbCkge1xuICAgICAgcGxheWVyLnNlZWtUbyhzZWVrLnNlY29uZHMsIHNlZWsuYWxsb3dTZWVrQWhlYWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDdWVzIHRoZSBwbGF5ZXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlLiAqL1xuICBwcml2YXRlIF9jdWVQbGF5ZXIoKSB7XG4gICAgaWYgKHRoaXMuX3BsYXllciAmJiB0aGlzLnZpZGVvSWQpIHtcbiAgICAgIHRoaXMuX3BsYXllci5jdWVWaWRlb0J5SWQoe1xuICAgICAgICB2aWRlb0lkOiB0aGlzLnZpZGVvSWQsXG4gICAgICAgIHN0YXJ0U2Vjb25kczogdGhpcy5zdGFydFNlY29uZHMsXG4gICAgICAgIGVuZFNlY29uZHM6IHRoaXMuZW5kU2Vjb25kcyxcbiAgICAgICAgc3VnZ2VzdGVkUXVhbGl0eTogdGhpcy5zdWdnZXN0ZWRRdWFsaXR5LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgdGhlIHBsYXllcidzIHNpemUgYmFzZWQgb24gdGhlIGN1cnJlbnQgaW5wdXQgdmFsdWVzLiAqL1xuICBwcml2YXRlIF9zZXRTaXplKCkge1xuICAgIHRoaXMuX3BsYXllcj8uc2V0U2l6ZSh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gIH1cblxuICAvKiogU2V0cyB0aGUgcGxheWVyJ3MgcXVhbGl0eSBiYXNlZCBvbiB0aGUgY3VycmVudCBpbnB1dCB2YWx1ZXMuICovXG4gIHByaXZhdGUgX3NldFF1YWxpdHkoKSB7XG4gICAgaWYgKHRoaXMuX3BsYXllciAmJiB0aGlzLnN1Z2dlc3RlZFF1YWxpdHkpIHtcbiAgICAgIHRoaXMuX3BsYXllci5zZXRQbGF5YmFja1F1YWxpdHkodGhpcy5zdWdnZXN0ZWRRdWFsaXR5KTtcbiAgICB9XG4gIH1cblxuICAvKiogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgYWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgcGxheWVyIHdoZW4gYSB1c2VyIHN1YnNjcmliZXMgdG8gaXQuICovXG4gIHByaXZhdGUgX2dldExhenlFbWl0dGVyPFQgZXh0ZW5kcyBZVC5QbGF5ZXJFdmVudD4obmFtZToga2V5b2YgWVQuRXZlbnRzKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgLy8gU3RhcnQgd2l0aCB0aGUgc3RyZWFtIG9mIHBsYXllcnMuIFRoaXMgd2F5IHRoZSBldmVudHMgd2lsbCBiZSB0cmFuc2ZlcnJlZFxuICAgIC8vIG92ZXIgdG8gdGhlIG5ldyBwbGF5ZXIgaWYgaXQgZ2V0cyBzd2FwcGVkIG91dCB1bmRlci10aGUtaG9vZC5cbiAgICByZXR1cm4gdGhpcy5fcGxheWVyQ2hhbmdlcy5waXBlKFxuICAgICAgLy8gU3dpdGNoIHRvIHRoZSBib3VuZCBldmVudC4gYHN3aXRjaE1hcGAgZW5zdXJlcyB0aGF0IHRoZSBvbGQgZXZlbnQgaXMgcmVtb3ZlZCB3aGVuIHRoZVxuICAgICAgLy8gcGxheWVyIGlzIGNoYW5nZWQuIElmIHRoZXJlJ3Mgbm8gcGxheWVyLCByZXR1cm4gYW4gb2JzZXJ2YWJsZSB0aGF0IG5ldmVyIGVtaXRzLlxuICAgICAgc3dpdGNoTWFwKHBsYXllciA9PiB7XG4gICAgICAgIHJldHVybiBwbGF5ZXJcbiAgICAgICAgICA/IGZyb21FdmVudFBhdHRlcm48VD4oXG4gICAgICAgICAgICAgIChsaXN0ZW5lcjogKGV2ZW50OiBUKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgICAgICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAobGlzdGVuZXI6IChldmVudDogVCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBBUEkgc2VlbXMgdG8gdGhyb3cgd2hlbiB3ZSB0cnkgdG8gdW5iaW5kIGZyb20gYSBkZXN0cm95ZWQgcGxheWVyIGFuZCBpdCBkb2Vzbid0XG4gICAgICAgICAgICAgICAgLy8gZXhwb3NlIHdoZXRoZXIgdGhlIHBsYXllciBoYXMgYmVlbiBkZXN0cm95ZWQgc28gd2UgaGF2ZSB0byB3cmFwIGl0IGluIGEgdHJ5L2NhdGNoIHRvXG4gICAgICAgICAgICAgICAgLy8gcHJldmVudCB0aGUgZW50aXJlIHN0cmVhbSBmcm9tIGVycm9yaW5nIG91dC5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgcGxheWVyPy5yZW1vdmVFdmVudExpc3RlbmVyPy4obmFtZSwgbGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge31cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IG9ic2VydmFibGVPZjxUPigpO1xuICAgICAgfSksXG4gICAgICAvLyBCeSBkZWZhdWx0IHdlIHJ1biBhbGwgdGhlIEFQSSBpbnRlcmFjdGlvbnMgb3V0c2lkZSB0aGUgem9uZVxuICAgICAgLy8gc28gd2UgaGF2ZSB0byBicmluZyB0aGUgZXZlbnRzIGJhY2sgaW4gbWFudWFsbHkgd2hlbiB0aGV5IGVtaXQuXG4gICAgICBzb3VyY2UgPT5cbiAgICAgICAgbmV3IE9ic2VydmFibGU8VD4ob2JzZXJ2ZXIgPT5cbiAgICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IHZhbHVlID0+IHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gb2JzZXJ2ZXIubmV4dCh2YWx1ZSkpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yID0+IG9ic2VydmVyLmVycm9yKGVycm9yKSxcbiAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiBvYnNlcnZlci5jb21wbGV0ZSgpLFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgLy8gRW5zdXJlcyB0aGF0IGV2ZXJ5dGhpbmcgaXMgY2xlYXJlZCBvdXQgb24gZGVzdHJveS5cbiAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpLFxuICAgICk7XG4gIH1cbn1cblxubGV0IGFwaUxvYWRlZCA9IGZhbHNlO1xuXG4vKiogTG9hZHMgdGhlIFlvdVR1YmUgQVBJIGZyb20gYSBzcGVjaWZpZWQgVVJMIG9ubHkgb25jZS4gKi9cbmZ1bmN0aW9uIGxvYWRBcGkobm9uY2U6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgaWYgKGFwaUxvYWRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFdlIGNhbiB1c2UgYGRvY3VtZW50YCBkaXJlY3RseSBoZXJlLCBiZWNhdXNlIHRoaXMgbG9naWMgZG9lc24ndCBydW4gb3V0c2lkZSB0aGUgYnJvd3Nlci5cbiAgY29uc3QgdXJsID0gJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2lmcmFtZV9hcGknO1xuICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgY29uc3QgY2FsbGJhY2sgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgc2NyaXB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjYWxsYmFjayk7XG4gICAgc2NyaXB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgY2FsbGJhY2spO1xuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgIGFwaUxvYWRlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBsb2FkIFlvdVR1YmUgQVBJIGZyb20gJHt1cmx9YCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNhbGxiYWNrKTtcbiAgc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgY2FsbGJhY2spO1xuICAoc2NyaXB0IGFzIGFueSkuc3JjID0gdXJsO1xuICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuXG4gIGlmIChub25jZSkge1xuICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpO1xuICB9XG5cbiAgLy8gU2V0IHRoaXMgaW1tZWRpYXRlbHkgdG8gdHJ1ZSBzbyB3ZSBkb24ndCBzdGFydCBsb2FkaW5nIGFub3RoZXIgc2NyaXB0XG4gIC8vIHdoaWxlIHRoaXMgb25lIGlzIHBlbmRpbmcuIElmIGxvYWRpbmcgZmFpbHMsIHdlJ2xsIGZsaXAgaXQgYmFjayB0byBmYWxzZS5cbiAgYXBpTG9hZGVkID0gdHJ1ZTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xufVxuIl19
@@ -19,8 +19,8 @@ class YouTubePlayerPlaceholder {
19
19
  }
20
20
  return `url(${url})`;
21
21
  }
22
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayerPlaceholder, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: YouTubePlayerPlaceholder, isStandalone: true, selector: "youtube-player-placeholder", inputs: { videoId: "videoId", width: "width", height: "height", isLoading: "isLoading", buttonLabel: "buttonLabel", quality: "quality" }, host: { properties: { "class.youtube-player-placeholder-loading": "isLoading", "style.background-image": "_getBackgroundImage()", "style.width.px": "width", "style.height.px": "height" }, classAttribute: "youtube-player-placeholder" }, ngImport: i0, template: `
22
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerPlaceholder, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0-next.2", type: YouTubePlayerPlaceholder, isStandalone: true, selector: "youtube-player-placeholder", inputs: { videoId: "videoId", width: "width", height: "height", isLoading: "isLoading", buttonLabel: "buttonLabel", quality: "quality" }, host: { properties: { "class.youtube-player-placeholder-loading": "isLoading", "style.background-image": "_getBackgroundImage()", "style.width.px": "width", "style.height.px": "height" }, classAttribute: "youtube-player-placeholder" }, ngImport: i0, template: `
24
24
  <button type="button" class="youtube-player-placeholder-button" [attr.aria-label]="buttonLabel">
25
25
  <svg
26
26
  height="100%"
@@ -34,7 +34,7 @@ class YouTubePlayerPlaceholder {
34
34
  </button>
35
35
  `, isInline: true, styles: [".youtube-player-placeholder{display:flex;align-items:center;justify-content:center;width:100%;overflow:hidden;cursor:pointer;background-color:#000;background-position:center center;background-size:cover;transition:box-shadow 300ms ease;box-shadow:inset 0 120px 90px -90px rgba(0,0,0,.8)}.youtube-player-placeholder-button{transition:opacity 300ms ease;-moz-appearance:none;-webkit-appearance:none;background:none;border:none;padding:0;display:flex}.youtube-player-placeholder-button svg{width:68px;height:48px}.youtube-player-placeholder-loading{box-shadow:none}.youtube-player-placeholder-loading .youtube-player-placeholder-button{opacity:0}"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
36
36
  }
37
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayerPlaceholder, decorators: [{
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerPlaceholder, decorators: [{
38
38
  type: Component,
39
39
  args: [{ selector: 'youtube-player-placeholder', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
40
40
  <button type="button" class="youtube-player-placeholder-button" [attr.aria-label]="buttonLabel">
@@ -531,8 +531,8 @@ class YouTubePlayer {
531
531
  // Ensures that everything is cleared out on destroy.
532
532
  takeUntil(this._destroyed));
533
533
  }
534
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayer, deps: [{ token: i0.NgZone }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
535
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: YouTubePlayer, isStandalone: true, selector: "youtube-player", inputs: { videoId: "videoId", height: ["height", "height", numberAttribute], width: ["width", "width", numberAttribute], startSeconds: ["startSeconds", "startSeconds", coerceTime], endSeconds: ["endSeconds", "endSeconds", coerceTime], suggestedQuality: "suggestedQuality", playerVars: "playerVars", disableCookies: ["disableCookies", "disableCookies", booleanAttribute], loadApi: ["loadApi", "loadApi", booleanAttribute], disablePlaceholder: ["disablePlaceholder", "disablePlaceholder", booleanAttribute], showBeforeIframeApiLoads: ["showBeforeIframeApiLoads", "showBeforeIframeApiLoads", booleanAttribute], placeholderButtonLabel: "placeholderButtonLabel", placeholderImageQuality: "placeholderImageQuality" }, outputs: { ready: "ready", stateChange: "stateChange", error: "error", apiChange: "apiChange", playbackQualityChange: "playbackQualityChange", playbackRateChange: "playbackRateChange" }, viewQueries: [{ propertyName: "youtubeContainer", first: true, predicate: ["youtubeContainer"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
534
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayer, deps: [{ token: i0.NgZone }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
535
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0-next.2", type: YouTubePlayer, isStandalone: true, selector: "youtube-player", inputs: { videoId: "videoId", height: ["height", "height", numberAttribute], width: ["width", "width", numberAttribute], startSeconds: ["startSeconds", "startSeconds", coerceTime], endSeconds: ["endSeconds", "endSeconds", coerceTime], suggestedQuality: "suggestedQuality", playerVars: "playerVars", disableCookies: ["disableCookies", "disableCookies", booleanAttribute], loadApi: ["loadApi", "loadApi", booleanAttribute], disablePlaceholder: ["disablePlaceholder", "disablePlaceholder", booleanAttribute], showBeforeIframeApiLoads: ["showBeforeIframeApiLoads", "showBeforeIframeApiLoads", booleanAttribute], placeholderButtonLabel: "placeholderButtonLabel", placeholderImageQuality: "placeholderImageQuality" }, outputs: { ready: "ready", stateChange: "stateChange", error: "error", apiChange: "apiChange", playbackQualityChange: "playbackQualityChange", playbackRateChange: "playbackRateChange" }, viewQueries: [{ propertyName: "youtubeContainer", first: true, predicate: ["youtubeContainer"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
536
536
  @if (_shouldShowPlaceholder()) {
537
537
  <youtube-player-placeholder
538
538
  [videoId]="videoId!"
@@ -548,7 +548,7 @@ class YouTubePlayer {
548
548
  </div>
549
549
  `, isInline: true, dependencies: [{ kind: "component", type: YouTubePlayerPlaceholder, selector: "youtube-player-placeholder", inputs: ["videoId", "width", "height", "isLoading", "buttonLabel", "quality"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
550
550
  }
551
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayer, decorators: [{
551
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayer, decorators: [{
552
552
  type: Component,
553
553
  args: [{
554
554
  selector: 'youtube-player',
@@ -658,11 +658,11 @@ function loadApi(nonce) {
658
658
  }
659
659
 
660
660
  class YouTubePlayerModule {
661
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
662
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayerModule, imports: [YouTubePlayer], exports: [YouTubePlayer] }); }
663
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayerModule }); }
661
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
662
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerModule, imports: [YouTubePlayer], exports: [YouTubePlayer] }); }
663
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerModule }); }
664
664
  }
665
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: YouTubePlayerModule, decorators: [{
665
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerModule, decorators: [{
666
666
  type: NgModule,
667
667
  args: [{
668
668
  imports: [YouTubePlayer],
@@ -1 +1 @@
1
- {"version":3,"file":"youtube-player.mjs","sources":["../../../../../../src/youtube-player/youtube-player-placeholder.ts","../../../../../../src/youtube-player/youtube-player.ts","../../../../../../src/youtube-player/youtube-module.ts","../../../../../../src/youtube-player/youtube-player_public_index.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ChangeDetectionStrategy, Component, Input, ViewEncapsulation} from '@angular/core';\n\n/** Quality of the placeholder image. */\nexport type PlaceholderImageQuality = 'high' | 'standard' | 'low';\n\n@Component({\n selector: 'youtube-player-placeholder',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <button type=\"button\" class=\"youtube-player-placeholder-button\" [attr.aria-label]=\"buttonLabel\">\n <svg\n height=\"100%\"\n version=\"1.1\"\n viewBox=\"0 0 68 48\"\n focusable=\"false\"\n aria-hidden=\"true\">\n <path d=\"M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z\" fill=\"#f00\"></path>\n <path d=\"M 45,24 27,14 27,34\" fill=\"#fff\"></path>\n </svg>\n </button>\n `,\n standalone: true,\n styleUrl: 'youtube-player-placeholder.css',\n host: {\n 'class': 'youtube-player-placeholder',\n '[class.youtube-player-placeholder-loading]': 'isLoading',\n '[style.background-image]': '_getBackgroundImage()',\n '[style.width.px]': 'width',\n '[style.height.px]': 'height',\n },\n})\nexport class YouTubePlayerPlaceholder {\n /** ID of the video for which to show the placeholder. */\n @Input() videoId: string;\n\n /** Width of the video for which to show the placeholder. */\n @Input() width: number;\n\n /** Height of the video for which to show the placeholder. */\n @Input() height: number;\n\n /** Whether the video is currently being loaded. */\n @Input() isLoading: boolean;\n\n /** Accessible label for the play button. */\n @Input() buttonLabel: string;\n\n /** Quality of the placeholder image. */\n @Input() quality: PlaceholderImageQuality;\n\n /** Gets the background image showing the placeholder. */\n protected _getBackgroundImage(): string | undefined {\n let url: string;\n\n if (this.quality === 'low') {\n url = `https://i.ytimg.com/vi/${this.videoId}/hqdefault.jpg`;\n } else if (this.quality === 'high') {\n url = `https://i.ytimg.com/vi/${this.videoId}/maxresdefault.jpg`;\n } else {\n url = `https://i.ytimg.com/vi_webp/${this.videoId}/sddefault.webp`;\n }\n\n return `url(${url})`;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n// Workaround for: https://github.com/bazelbuild/rules_nodejs/issues/1265\n/// <reference types=\"youtube\" preserve=\"true\" />\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n NgZone,\n OnDestroy,\n Output,\n ViewChild,\n ViewEncapsulation,\n Inject,\n PLATFORM_ID,\n OnChanges,\n SimpleChanges,\n booleanAttribute,\n numberAttribute,\n InjectionToken,\n inject,\n CSP_NONCE,\n ChangeDetectorRef,\n AfterViewInit,\n} from '@angular/core';\nimport {isPlatformBrowser} from '@angular/common';\nimport {Observable, of as observableOf, Subject, BehaviorSubject, fromEventPattern} from 'rxjs';\nimport {takeUntil, switchMap} from 'rxjs/operators';\nimport {PlaceholderImageQuality, YouTubePlayerPlaceholder} from './youtube-player-placeholder';\n\ndeclare global {\n interface Window {\n YT: typeof YT | undefined;\n onYouTubeIframeAPIReady: (() => void) | undefined;\n }\n}\n\n/** Injection token used to configure the `YouTubePlayer`. */\nexport const YOUTUBE_PLAYER_CONFIG = new InjectionToken<YouTubePlayerConfig>(\n 'YOUTUBE_PLAYER_CONFIG',\n);\n\n/** Object that can be used to configure the `YouTubePlayer`. */\nexport interface YouTubePlayerConfig {\n /** Whether to load the YouTube iframe API automatically. Defaults to `true`. */\n loadApi?: boolean;\n\n /**\n * By default the player shows a placeholder image instead of loading the YouTube API which\n * improves the initial page load performance. Use this option to disable the placeholder loading\n * behavior globally. Defaults to `false`.\n */\n disablePlaceholder?: boolean;\n\n /** Accessible label for the play button inside of the placeholder. */\n placeholderButtonLabel?: string;\n\n /**\n * Quality of the displayed placeholder image. Defaults to `standard`,\n * because not all video have a high-quality placeholder.\n */\n placeholderImageQuality?: PlaceholderImageQuality;\n}\n\nexport const DEFAULT_PLAYER_WIDTH = 640;\nexport const DEFAULT_PLAYER_HEIGHT = 390;\n\n/**\n * Object used to store the state of the player if the\n * user tries to interact with the API before it has been loaded.\n */\ninterface PendingPlayerState {\n playbackState?: PlayerState.PLAYING | PlayerState.PAUSED | PlayerState.CUED;\n playbackRate?: number;\n volume?: number;\n muted?: boolean;\n seek?: {seconds: number; allowSeekAhead: boolean};\n}\n\n/** Coercion function for time values. */\nfunction coerceTime(value: number | undefined): number | undefined {\n return value == null ? value : numberAttribute(value, 0);\n}\n\n/**\n * Equivalent of `YT.PlayerState` which we can't use, because it's meant to\n * be read off the `window` which we can't do before the API has been loaded.\n */\nenum PlayerState {\n UNSTARTED = -1,\n ENDED = 0,\n PLAYING = 1,\n PAUSED = 2,\n BUFFERING = 3,\n CUED = 5,\n}\n\n/**\n * Angular component that renders a YouTube player via the YouTube player\n * iframe API.\n * @see https://developers.google.com/youtube/iframe_api_reference\n */\n@Component({\n selector: 'youtube-player',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [YouTubePlayerPlaceholder],\n template: `\n @if (_shouldShowPlaceholder()) {\n <youtube-player-placeholder\n [videoId]=\"videoId!\"\n [width]=\"width\"\n [height]=\"height\"\n [isLoading]=\"_isLoading\"\n [buttonLabel]=\"placeholderButtonLabel\"\n [quality]=\"placeholderImageQuality\"\n (click)=\"_load(true)\"/>\n }\n <div [style.display]=\"_shouldShowPlaceholder() ? 'none' : ''\">\n <div #youtubeContainer></div>\n </div>\n `,\n})\nexport class YouTubePlayer implements AfterViewInit, OnChanges, OnDestroy {\n /** Whether we're currently rendering inside a browser. */\n private readonly _isBrowser: boolean;\n private _player: YT.Player | undefined;\n private _pendingPlayer: YT.Player | undefined;\n private _existingApiReadyCallback: (() => void) | undefined;\n private _pendingPlayerState: PendingPlayerState | undefined;\n private readonly _destroyed = new Subject<void>();\n private readonly _playerChanges = new BehaviorSubject<YT.Player | undefined>(undefined);\n private readonly _nonce = inject(CSP_NONCE, {optional: true});\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\n protected _isLoading = false;\n protected _hasPlaceholder = true;\n\n /** YouTube Video ID to view */\n @Input()\n videoId: string | undefined;\n\n /** Height of video player */\n @Input({transform: numberAttribute})\n get height(): number {\n return this._height;\n }\n set height(height: number | undefined) {\n this._height = height == null || isNaN(height) ? DEFAULT_PLAYER_HEIGHT : height;\n }\n private _height = DEFAULT_PLAYER_HEIGHT;\n\n /** Width of video player */\n @Input({transform: numberAttribute})\n get width(): number {\n return this._width;\n }\n set width(width: number | undefined) {\n this._width = width == null || isNaN(width) ? DEFAULT_PLAYER_WIDTH : width;\n }\n private _width = DEFAULT_PLAYER_WIDTH;\n\n /** The moment when the player is supposed to start playing */\n @Input({transform: coerceTime})\n startSeconds: number | undefined;\n\n /** The moment when the player is supposed to stop playing */\n @Input({transform: coerceTime})\n endSeconds: number | undefined;\n\n /** The suggested quality of the player */\n @Input()\n suggestedQuality: YT.SuggestedVideoQuality | undefined;\n\n /**\n * Extra parameters used to configure the player. See:\n * https://developers.google.com/youtube/player_parameters.html?playerVersion=HTML5#Parameters\n */\n @Input()\n playerVars: YT.PlayerVars | undefined;\n\n /** Whether cookies inside the player have been disabled. */\n @Input({transform: booleanAttribute})\n disableCookies: boolean = false;\n\n /** Whether to automatically load the YouTube iframe API. Defaults to `true`. */\n @Input({transform: booleanAttribute})\n loadApi: boolean;\n\n /**\n * By default the player shows a placeholder image instead of loading the YouTube API which\n * improves the initial page load performance. This input allows for the behavior to be disabled.\n */\n @Input({transform: booleanAttribute})\n disablePlaceholder: boolean = false;\n\n /**\n * Whether the iframe will attempt to load regardless of the status of the api on the\n * page. Set this to true if you don't want the `onYouTubeIframeAPIReady` field to be\n * set on the global window.\n */\n @Input({transform: booleanAttribute}) showBeforeIframeApiLoads: boolean = false;\n\n /** Accessible label for the play button inside of the placeholder. */\n @Input() placeholderButtonLabel: string;\n\n /**\n * Quality of the displayed placeholder image. Defaults to `standard`,\n * because not all video have a high-quality placeholder.\n */\n @Input() placeholderImageQuality: PlaceholderImageQuality;\n\n /** Outputs are direct proxies from the player itself. */\n @Output() readonly ready: Observable<YT.PlayerEvent> =\n this._getLazyEmitter<YT.PlayerEvent>('onReady');\n\n @Output() readonly stateChange: Observable<YT.OnStateChangeEvent> =\n this._getLazyEmitter<YT.OnStateChangeEvent>('onStateChange');\n\n @Output() readonly error: Observable<YT.OnErrorEvent> =\n this._getLazyEmitter<YT.OnErrorEvent>('onError');\n\n @Output() readonly apiChange: Observable<YT.PlayerEvent> =\n this._getLazyEmitter<YT.PlayerEvent>('onApiChange');\n\n @Output() readonly playbackQualityChange: Observable<YT.OnPlaybackQualityChangeEvent> =\n this._getLazyEmitter<YT.OnPlaybackQualityChangeEvent>('onPlaybackQualityChange');\n\n @Output() readonly playbackRateChange: Observable<YT.OnPlaybackRateChangeEvent> =\n this._getLazyEmitter<YT.OnPlaybackRateChangeEvent>('onPlaybackRateChange');\n\n /** The element that will be replaced by the iframe. */\n @ViewChild('youtubeContainer', {static: true})\n youtubeContainer: ElementRef<HTMLElement>;\n\n constructor(\n private _ngZone: NgZone,\n @Inject(PLATFORM_ID) platformId: Object,\n ) {\n const config = inject(YOUTUBE_PLAYER_CONFIG, {optional: true});\n this.loadApi = config?.loadApi ?? true;\n this.disablePlaceholder = !!config?.disablePlaceholder;\n this.placeholderButtonLabel = config?.placeholderButtonLabel || 'Play video';\n this.placeholderImageQuality = config?.placeholderImageQuality || 'standard';\n this._isBrowser = isPlatformBrowser(platformId);\n }\n\n ngAfterViewInit() {\n this._conditionallyLoad();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this._shouldRecreatePlayer(changes)) {\n this._conditionallyLoad();\n } else if (this._player) {\n if (changes['width'] || changes['height']) {\n this._setSize();\n }\n\n if (changes['suggestedQuality']) {\n this._setQuality();\n }\n\n if (changes['startSeconds'] || changes['endSeconds'] || changes['suggestedQuality']) {\n this._cuePlayer();\n }\n }\n }\n\n ngOnDestroy() {\n this._pendingPlayer?.destroy();\n\n if (this._player) {\n this._player.destroy();\n window.onYouTubeIframeAPIReady = this._existingApiReadyCallback;\n }\n\n this._playerChanges.complete();\n this._destroyed.next();\n this._destroyed.complete();\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#playVideo */\n playVideo() {\n if (this._player) {\n this._player.playVideo();\n } else {\n this._getPendingState().playbackState = PlayerState.PLAYING;\n this._load(true);\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#pauseVideo */\n pauseVideo() {\n if (this._player) {\n this._player.pauseVideo();\n } else {\n this._getPendingState().playbackState = PlayerState.PAUSED;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#stopVideo */\n stopVideo() {\n if (this._player) {\n this._player.stopVideo();\n } else {\n // It seems like YouTube sets the player to CUED when it's stopped.\n this._getPendingState().playbackState = PlayerState.CUED;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#seekTo */\n seekTo(seconds: number, allowSeekAhead: boolean) {\n if (this._player) {\n this._player.seekTo(seconds, allowSeekAhead);\n } else {\n this._getPendingState().seek = {seconds, allowSeekAhead};\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#mute */\n mute() {\n if (this._player) {\n this._player.mute();\n } else {\n this._getPendingState().muted = true;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#unMute */\n unMute() {\n if (this._player) {\n this._player.unMute();\n } else {\n this._getPendingState().muted = false;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#isMuted */\n isMuted(): boolean {\n if (this._player) {\n return this._player.isMuted();\n }\n\n if (this._pendingPlayerState) {\n return !!this._pendingPlayerState.muted;\n }\n\n return false;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#setVolume */\n setVolume(volume: number) {\n if (this._player) {\n this._player.setVolume(volume);\n } else {\n this._getPendingState().volume = volume;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVolume */\n getVolume(): number {\n if (this._player) {\n return this._player.getVolume();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.volume != null) {\n return this._pendingPlayerState.volume;\n }\n\n return 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate */\n setPlaybackRate(playbackRate: number) {\n if (this._player) {\n return this._player.setPlaybackRate(playbackRate);\n } else {\n this._getPendingState().playbackRate = playbackRate;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackRate */\n getPlaybackRate(): number {\n if (this._player) {\n return this._player.getPlaybackRate();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.playbackRate != null) {\n return this._pendingPlayerState.playbackRate;\n }\n\n return 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getAvailablePlaybackRates */\n getAvailablePlaybackRates(): number[] {\n return this._player ? this._player.getAvailablePlaybackRates() : [];\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoLoadedFraction */\n getVideoLoadedFraction(): number {\n return this._player ? this._player.getVideoLoadedFraction() : 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlayerState */\n getPlayerState(): YT.PlayerState | undefined {\n if (!this._isBrowser || !window.YT) {\n return undefined;\n }\n\n if (this._player) {\n return this._player.getPlayerState();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.playbackState != null) {\n return this._pendingPlayerState.playbackState;\n }\n\n return PlayerState.UNSTARTED;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getCurrentTime */\n getCurrentTime(): number {\n if (this._player) {\n return this._player.getCurrentTime();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.seek) {\n return this._pendingPlayerState.seek.seconds;\n }\n\n return 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackQuality */\n getPlaybackQuality(): YT.SuggestedVideoQuality {\n return this._player ? this._player.getPlaybackQuality() : 'default';\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getAvailableQualityLevels */\n getAvailableQualityLevels(): YT.SuggestedVideoQuality[] {\n return this._player ? this._player.getAvailableQualityLevels() : [];\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getDuration */\n getDuration(): number {\n return this._player ? this._player.getDuration() : 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoUrl */\n getVideoUrl(): string {\n return this._player ? this._player.getVideoUrl() : '';\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoEmbedCode */\n getVideoEmbedCode(): string {\n return this._player ? this._player.getVideoEmbedCode() : '';\n }\n\n /**\n * Loads the YouTube API and sets up the player.\n * @param playVideo Whether to automatically play the video once the player is loaded.\n */\n protected _load(playVideo: boolean) {\n // Don't do anything if we're not in a browser environment.\n if (!this._isBrowser) {\n return;\n }\n\n if (!window.YT || !window.YT.Player) {\n if (this.loadApi) {\n this._isLoading = true;\n loadApi(this._nonce);\n } else if (this.showBeforeIframeApiLoads && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw new Error(\n 'Namespace YT not found, cannot construct embedded youtube player. ' +\n 'Please install the YouTube Player API Reference for iframe Embeds: ' +\n 'https://developers.google.com/youtube/iframe_api_reference',\n );\n }\n\n this._existingApiReadyCallback = window.onYouTubeIframeAPIReady;\n\n window.onYouTubeIframeAPIReady = () => {\n this._existingApiReadyCallback?.();\n this._ngZone.run(() => this._createPlayer(playVideo));\n };\n } else {\n this._createPlayer(playVideo);\n }\n }\n\n /** Loads the player depending on the internal state of the component. */\n private _conditionallyLoad() {\n // If the placeholder isn't shown anymore, we have to trigger a load.\n if (!this._shouldShowPlaceholder()) {\n this._load(false);\n } else if (this.playerVars?.autoplay === 1) {\n // If it's an autoplaying video, we have to hide the placeholder and start playing.\n this._load(true);\n }\n }\n\n /** Whether to show the placeholder element. */\n protected _shouldShowPlaceholder(): boolean {\n if (this.disablePlaceholder) {\n return false;\n }\n\n // Since we don't load the API on the server, we show the placeholder permanently.\n if (!this._isBrowser) {\n return true;\n }\n\n return this._hasPlaceholder && !!this.videoId && !this._player;\n }\n\n /** Gets an object that should be used to store the temporary API state. */\n private _getPendingState(): PendingPlayerState {\n if (!this._pendingPlayerState) {\n this._pendingPlayerState = {};\n }\n\n return this._pendingPlayerState;\n }\n\n /**\n * Determines whether a change in the component state\n * requires the YouTube player to be recreated.\n */\n private _shouldRecreatePlayer(changes: SimpleChanges): boolean {\n const change =\n changes['videoId'] ||\n changes['playerVars'] ||\n changes['disableCookies'] ||\n changes['disablePlaceholder'];\n return !!change && !change.isFirstChange();\n }\n\n /**\n * Creates a new YouTube player and destroys the existing one.\n * @param playVideo Whether to play the video once it loads.\n */\n private _createPlayer(playVideo: boolean) {\n this._player?.destroy();\n this._pendingPlayer?.destroy();\n\n // A player can't be created if the API isn't loaded,\n // or there isn't a video or playlist to be played.\n if (typeof YT === 'undefined' || (!this.videoId && !this.playerVars?.list)) {\n return;\n }\n\n // Important! We need to create the Player object outside of the `NgZone`, because it kicks\n // off a 250ms setInterval which will continually trigger change detection if we don't.\n const player = this._ngZone.runOutsideAngular(\n () =>\n new YT.Player(this.youtubeContainer.nativeElement, {\n videoId: this.videoId,\n host: this.disableCookies ? 'https://www.youtube-nocookie.com' : undefined,\n width: this.width,\n height: this.height,\n // Calling `playVideo` on load doesn't appear to actually play\n // the video so we need to trigger it through `playerVars` instead.\n playerVars: playVideo ? {...(this.playerVars || {}), autoplay: 1} : this.playerVars,\n }),\n );\n\n const whenReady = () => {\n // Only assign the player once it's ready, otherwise YouTube doesn't expose some APIs.\n this._ngZone.run(() => {\n this._isLoading = false;\n this._hasPlaceholder = false;\n this._player = player;\n this._pendingPlayer = undefined;\n player.removeEventListener('onReady', whenReady);\n this._playerChanges.next(player);\n this._setSize();\n this._setQuality();\n\n if (this._pendingPlayerState) {\n this._applyPendingPlayerState(player, this._pendingPlayerState);\n this._pendingPlayerState = undefined;\n }\n\n // Only cue the player when it either hasn't started yet or it's cued,\n // otherwise cuing it can interrupt a player with autoplay enabled.\n const state = player.getPlayerState();\n if (state === PlayerState.UNSTARTED || state === PlayerState.CUED || state == null) {\n this._cuePlayer();\n }\n\n this._changeDetectorRef.markForCheck();\n });\n };\n\n this._pendingPlayer = player;\n player.addEventListener('onReady', whenReady);\n }\n\n /** Applies any state that changed before the player was initialized. */\n private _applyPendingPlayerState(player: YT.Player, pendingState: PendingPlayerState): void {\n const {playbackState, playbackRate, volume, muted, seek} = pendingState;\n\n switch (playbackState) {\n case PlayerState.PLAYING:\n player.playVideo();\n break;\n case PlayerState.PAUSED:\n player.pauseVideo();\n break;\n case PlayerState.CUED:\n player.stopVideo();\n break;\n }\n\n if (playbackRate != null) {\n player.setPlaybackRate(playbackRate);\n }\n\n if (volume != null) {\n player.setVolume(volume);\n }\n\n if (muted != null) {\n muted ? player.mute() : player.unMute();\n }\n\n if (seek != null) {\n player.seekTo(seek.seconds, seek.allowSeekAhead);\n }\n }\n\n /** Cues the player based on the current component state. */\n private _cuePlayer() {\n if (this._player && this.videoId) {\n this._player.cueVideoById({\n videoId: this.videoId,\n startSeconds: this.startSeconds,\n endSeconds: this.endSeconds,\n suggestedQuality: this.suggestedQuality,\n });\n }\n }\n\n /** Sets the player's size based on the current input values. */\n private _setSize() {\n this._player?.setSize(this.width, this.height);\n }\n\n /** Sets the player's quality based on the current input values. */\n private _setQuality() {\n if (this._player && this.suggestedQuality) {\n this._player.setPlaybackQuality(this.suggestedQuality);\n }\n }\n\n /** Gets an observable that adds an event listener to the player when a user subscribes to it. */\n private _getLazyEmitter<T extends YT.PlayerEvent>(name: keyof YT.Events): Observable<T> {\n // Start with the stream of players. This way the events will be transferred\n // over to the new player if it gets swapped out under-the-hood.\n return this._playerChanges.pipe(\n // Switch to the bound event. `switchMap` ensures that the old event is removed when the\n // player is changed. If there's no player, return an observable that never emits.\n switchMap(player => {\n return player\n ? fromEventPattern<T>(\n (listener: (event: T) => void) => {\n player.addEventListener(name, listener);\n },\n (listener: (event: T) => void) => {\n // The API seems to throw when we try to unbind from a destroyed player and it doesn't\n // expose whether the player has been destroyed so we have to wrap it in a try/catch to\n // prevent the entire stream from erroring out.\n try {\n player?.removeEventListener?.(name, listener);\n } catch {}\n },\n )\n : observableOf<T>();\n }),\n // By default we run all the API interactions outside the zone\n // so we have to bring the events back in manually when they emit.\n source =>\n new Observable<T>(observer =>\n source.subscribe({\n next: value => this._ngZone.run(() => observer.next(value)),\n error: error => observer.error(error),\n complete: () => observer.complete(),\n }),\n ),\n // Ensures that everything is cleared out on destroy.\n takeUntil(this._destroyed),\n );\n }\n}\n\nlet apiLoaded = false;\n\n/** Loads the YouTube API from a specified URL only once. */\nfunction loadApi(nonce: string | null): void {\n if (apiLoaded) {\n return;\n }\n\n // We can use `document` directly here, because this logic doesn't run outside the browser.\n const url = 'https://www.youtube.com/iframe_api';\n const script = document.createElement('script');\n const callback = (event: Event) => {\n script.removeEventListener('load', callback);\n script.removeEventListener('error', callback);\n\n if (event.type === 'error') {\n apiLoaded = false;\n\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n console.error(`Failed to load YouTube API from ${url}`);\n }\n }\n };\n script.addEventListener('load', callback);\n script.addEventListener('error', callback);\n (script as any).src = url;\n script.async = true;\n\n if (nonce) {\n script.setAttribute('nonce', nonce);\n }\n\n // Set this immediately to true so we don't start loading another script\n // while this one is pending. If loading fails, we'll flip it back to false.\n apiLoaded = true;\n document.body.appendChild(script);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {YouTubePlayer} from './youtube-player';\n\n@NgModule({\n imports: [YouTubePlayer],\n exports: [YouTubePlayer],\n})\nexport class YouTubePlayerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["observableOf"],"mappings":"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"}
1
+ {"version":3,"file":"youtube-player.mjs","sources":["../../../../../../src/youtube-player/youtube-player-placeholder.ts","../../../../../../src/youtube-player/youtube-player.ts","../../../../../../src/youtube-player/youtube-module.ts","../../../../../../src/youtube-player/youtube-player_public_index.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ChangeDetectionStrategy, Component, Input, ViewEncapsulation} from '@angular/core';\n\n/** Quality of the placeholder image. */\nexport type PlaceholderImageQuality = 'high' | 'standard' | 'low';\n\n@Component({\n selector: 'youtube-player-placeholder',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <button type=\"button\" class=\"youtube-player-placeholder-button\" [attr.aria-label]=\"buttonLabel\">\n <svg\n height=\"100%\"\n version=\"1.1\"\n viewBox=\"0 0 68 48\"\n focusable=\"false\"\n aria-hidden=\"true\">\n <path d=\"M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z\" fill=\"#f00\"></path>\n <path d=\"M 45,24 27,14 27,34\" fill=\"#fff\"></path>\n </svg>\n </button>\n `,\n standalone: true,\n styleUrl: 'youtube-player-placeholder.css',\n host: {\n 'class': 'youtube-player-placeholder',\n '[class.youtube-player-placeholder-loading]': 'isLoading',\n '[style.background-image]': '_getBackgroundImage()',\n '[style.width.px]': 'width',\n '[style.height.px]': 'height',\n },\n})\nexport class YouTubePlayerPlaceholder {\n /** ID of the video for which to show the placeholder. */\n @Input() videoId: string;\n\n /** Width of the video for which to show the placeholder. */\n @Input() width: number;\n\n /** Height of the video for which to show the placeholder. */\n @Input() height: number;\n\n /** Whether the video is currently being loaded. */\n @Input() isLoading: boolean;\n\n /** Accessible label for the play button. */\n @Input() buttonLabel: string;\n\n /** Quality of the placeholder image. */\n @Input() quality: PlaceholderImageQuality;\n\n /** Gets the background image showing the placeholder. */\n protected _getBackgroundImage(): string | undefined {\n let url: string;\n\n if (this.quality === 'low') {\n url = `https://i.ytimg.com/vi/${this.videoId}/hqdefault.jpg`;\n } else if (this.quality === 'high') {\n url = `https://i.ytimg.com/vi/${this.videoId}/maxresdefault.jpg`;\n } else {\n url = `https://i.ytimg.com/vi_webp/${this.videoId}/sddefault.webp`;\n }\n\n return `url(${url})`;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n// Workaround for: https://github.com/bazelbuild/rules_nodejs/issues/1265\n/// <reference types=\"youtube\" preserve=\"true\" />\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n NgZone,\n OnDestroy,\n Output,\n ViewChild,\n ViewEncapsulation,\n Inject,\n PLATFORM_ID,\n OnChanges,\n SimpleChanges,\n booleanAttribute,\n numberAttribute,\n InjectionToken,\n inject,\n CSP_NONCE,\n ChangeDetectorRef,\n AfterViewInit,\n} from '@angular/core';\nimport {isPlatformBrowser} from '@angular/common';\nimport {Observable, of as observableOf, Subject, BehaviorSubject, fromEventPattern} from 'rxjs';\nimport {takeUntil, switchMap} from 'rxjs/operators';\nimport {PlaceholderImageQuality, YouTubePlayerPlaceholder} from './youtube-player-placeholder';\n\ndeclare global {\n interface Window {\n YT: typeof YT | undefined;\n onYouTubeIframeAPIReady: (() => void) | undefined;\n }\n}\n\n/** Injection token used to configure the `YouTubePlayer`. */\nexport const YOUTUBE_PLAYER_CONFIG = new InjectionToken<YouTubePlayerConfig>(\n 'YOUTUBE_PLAYER_CONFIG',\n);\n\n/** Object that can be used to configure the `YouTubePlayer`. */\nexport interface YouTubePlayerConfig {\n /** Whether to load the YouTube iframe API automatically. Defaults to `true`. */\n loadApi?: boolean;\n\n /**\n * By default the player shows a placeholder image instead of loading the YouTube API which\n * improves the initial page load performance. Use this option to disable the placeholder loading\n * behavior globally. Defaults to `false`.\n */\n disablePlaceholder?: boolean;\n\n /** Accessible label for the play button inside of the placeholder. */\n placeholderButtonLabel?: string;\n\n /**\n * Quality of the displayed placeholder image. Defaults to `standard`,\n * because not all video have a high-quality placeholder.\n */\n placeholderImageQuality?: PlaceholderImageQuality;\n}\n\nexport const DEFAULT_PLAYER_WIDTH = 640;\nexport const DEFAULT_PLAYER_HEIGHT = 390;\n\n/**\n * Object used to store the state of the player if the\n * user tries to interact with the API before it has been loaded.\n */\ninterface PendingPlayerState {\n playbackState?: PlayerState.PLAYING | PlayerState.PAUSED | PlayerState.CUED;\n playbackRate?: number;\n volume?: number;\n muted?: boolean;\n seek?: {seconds: number; allowSeekAhead: boolean};\n}\n\n/** Coercion function for time values. */\nfunction coerceTime(value: number | undefined): number | undefined {\n return value == null ? value : numberAttribute(value, 0);\n}\n\n/**\n * Equivalent of `YT.PlayerState` which we can't use, because it's meant to\n * be read off the `window` which we can't do before the API has been loaded.\n */\nenum PlayerState {\n UNSTARTED = -1,\n ENDED = 0,\n PLAYING = 1,\n PAUSED = 2,\n BUFFERING = 3,\n CUED = 5,\n}\n\n/**\n * Angular component that renders a YouTube player via the YouTube player\n * iframe API.\n * @see https://developers.google.com/youtube/iframe_api_reference\n */\n@Component({\n selector: 'youtube-player',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [YouTubePlayerPlaceholder],\n template: `\n @if (_shouldShowPlaceholder()) {\n <youtube-player-placeholder\n [videoId]=\"videoId!\"\n [width]=\"width\"\n [height]=\"height\"\n [isLoading]=\"_isLoading\"\n [buttonLabel]=\"placeholderButtonLabel\"\n [quality]=\"placeholderImageQuality\"\n (click)=\"_load(true)\"/>\n }\n <div [style.display]=\"_shouldShowPlaceholder() ? 'none' : ''\">\n <div #youtubeContainer></div>\n </div>\n `,\n})\nexport class YouTubePlayer implements AfterViewInit, OnChanges, OnDestroy {\n /** Whether we're currently rendering inside a browser. */\n private readonly _isBrowser: boolean;\n private _player: YT.Player | undefined;\n private _pendingPlayer: YT.Player | undefined;\n private _existingApiReadyCallback: (() => void) | undefined;\n private _pendingPlayerState: PendingPlayerState | undefined;\n private readonly _destroyed = new Subject<void>();\n private readonly _playerChanges = new BehaviorSubject<YT.Player | undefined>(undefined);\n private readonly _nonce = inject(CSP_NONCE, {optional: true});\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\n protected _isLoading = false;\n protected _hasPlaceholder = true;\n\n /** YouTube Video ID to view */\n @Input()\n videoId: string | undefined;\n\n /** Height of video player */\n @Input({transform: numberAttribute})\n get height(): number {\n return this._height;\n }\n set height(height: number | undefined) {\n this._height = height == null || isNaN(height) ? DEFAULT_PLAYER_HEIGHT : height;\n }\n private _height = DEFAULT_PLAYER_HEIGHT;\n\n /** Width of video player */\n @Input({transform: numberAttribute})\n get width(): number {\n return this._width;\n }\n set width(width: number | undefined) {\n this._width = width == null || isNaN(width) ? DEFAULT_PLAYER_WIDTH : width;\n }\n private _width = DEFAULT_PLAYER_WIDTH;\n\n /** The moment when the player is supposed to start playing */\n @Input({transform: coerceTime})\n startSeconds: number | undefined;\n\n /** The moment when the player is supposed to stop playing */\n @Input({transform: coerceTime})\n endSeconds: number | undefined;\n\n /** The suggested quality of the player */\n @Input()\n suggestedQuality: YT.SuggestedVideoQuality | undefined;\n\n /**\n * Extra parameters used to configure the player. See:\n * https://developers.google.com/youtube/player_parameters.html?playerVersion=HTML5#Parameters\n */\n @Input()\n playerVars: YT.PlayerVars | undefined;\n\n /** Whether cookies inside the player have been disabled. */\n @Input({transform: booleanAttribute})\n disableCookies: boolean = false;\n\n /** Whether to automatically load the YouTube iframe API. Defaults to `true`. */\n @Input({transform: booleanAttribute})\n loadApi: boolean;\n\n /**\n * By default the player shows a placeholder image instead of loading the YouTube API which\n * improves the initial page load performance. This input allows for the behavior to be disabled.\n */\n @Input({transform: booleanAttribute})\n disablePlaceholder: boolean = false;\n\n /**\n * Whether the iframe will attempt to load regardless of the status of the api on the\n * page. Set this to true if you don't want the `onYouTubeIframeAPIReady` field to be\n * set on the global window.\n */\n @Input({transform: booleanAttribute}) showBeforeIframeApiLoads: boolean = false;\n\n /** Accessible label for the play button inside of the placeholder. */\n @Input() placeholderButtonLabel: string;\n\n /**\n * Quality of the displayed placeholder image. Defaults to `standard`,\n * because not all video have a high-quality placeholder.\n */\n @Input() placeholderImageQuality: PlaceholderImageQuality;\n\n /** Outputs are direct proxies from the player itself. */\n @Output() readonly ready: Observable<YT.PlayerEvent> =\n this._getLazyEmitter<YT.PlayerEvent>('onReady');\n\n @Output() readonly stateChange: Observable<YT.OnStateChangeEvent> =\n this._getLazyEmitter<YT.OnStateChangeEvent>('onStateChange');\n\n @Output() readonly error: Observable<YT.OnErrorEvent> =\n this._getLazyEmitter<YT.OnErrorEvent>('onError');\n\n @Output() readonly apiChange: Observable<YT.PlayerEvent> =\n this._getLazyEmitter<YT.PlayerEvent>('onApiChange');\n\n @Output() readonly playbackQualityChange: Observable<YT.OnPlaybackQualityChangeEvent> =\n this._getLazyEmitter<YT.OnPlaybackQualityChangeEvent>('onPlaybackQualityChange');\n\n @Output() readonly playbackRateChange: Observable<YT.OnPlaybackRateChangeEvent> =\n this._getLazyEmitter<YT.OnPlaybackRateChangeEvent>('onPlaybackRateChange');\n\n /** The element that will be replaced by the iframe. */\n @ViewChild('youtubeContainer', {static: true})\n youtubeContainer: ElementRef<HTMLElement>;\n\n constructor(\n private _ngZone: NgZone,\n @Inject(PLATFORM_ID) platformId: Object,\n ) {\n const config = inject(YOUTUBE_PLAYER_CONFIG, {optional: true});\n this.loadApi = config?.loadApi ?? true;\n this.disablePlaceholder = !!config?.disablePlaceholder;\n this.placeholderButtonLabel = config?.placeholderButtonLabel || 'Play video';\n this.placeholderImageQuality = config?.placeholderImageQuality || 'standard';\n this._isBrowser = isPlatformBrowser(platformId);\n }\n\n ngAfterViewInit() {\n this._conditionallyLoad();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this._shouldRecreatePlayer(changes)) {\n this._conditionallyLoad();\n } else if (this._player) {\n if (changes['width'] || changes['height']) {\n this._setSize();\n }\n\n if (changes['suggestedQuality']) {\n this._setQuality();\n }\n\n if (changes['startSeconds'] || changes['endSeconds'] || changes['suggestedQuality']) {\n this._cuePlayer();\n }\n }\n }\n\n ngOnDestroy() {\n this._pendingPlayer?.destroy();\n\n if (this._player) {\n this._player.destroy();\n window.onYouTubeIframeAPIReady = this._existingApiReadyCallback;\n }\n\n this._playerChanges.complete();\n this._destroyed.next();\n this._destroyed.complete();\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#playVideo */\n playVideo() {\n if (this._player) {\n this._player.playVideo();\n } else {\n this._getPendingState().playbackState = PlayerState.PLAYING;\n this._load(true);\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#pauseVideo */\n pauseVideo() {\n if (this._player) {\n this._player.pauseVideo();\n } else {\n this._getPendingState().playbackState = PlayerState.PAUSED;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#stopVideo */\n stopVideo() {\n if (this._player) {\n this._player.stopVideo();\n } else {\n // It seems like YouTube sets the player to CUED when it's stopped.\n this._getPendingState().playbackState = PlayerState.CUED;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#seekTo */\n seekTo(seconds: number, allowSeekAhead: boolean) {\n if (this._player) {\n this._player.seekTo(seconds, allowSeekAhead);\n } else {\n this._getPendingState().seek = {seconds, allowSeekAhead};\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#mute */\n mute() {\n if (this._player) {\n this._player.mute();\n } else {\n this._getPendingState().muted = true;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#unMute */\n unMute() {\n if (this._player) {\n this._player.unMute();\n } else {\n this._getPendingState().muted = false;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#isMuted */\n isMuted(): boolean {\n if (this._player) {\n return this._player.isMuted();\n }\n\n if (this._pendingPlayerState) {\n return !!this._pendingPlayerState.muted;\n }\n\n return false;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#setVolume */\n setVolume(volume: number) {\n if (this._player) {\n this._player.setVolume(volume);\n } else {\n this._getPendingState().volume = volume;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVolume */\n getVolume(): number {\n if (this._player) {\n return this._player.getVolume();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.volume != null) {\n return this._pendingPlayerState.volume;\n }\n\n return 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate */\n setPlaybackRate(playbackRate: number) {\n if (this._player) {\n return this._player.setPlaybackRate(playbackRate);\n } else {\n this._getPendingState().playbackRate = playbackRate;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackRate */\n getPlaybackRate(): number {\n if (this._player) {\n return this._player.getPlaybackRate();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.playbackRate != null) {\n return this._pendingPlayerState.playbackRate;\n }\n\n return 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getAvailablePlaybackRates */\n getAvailablePlaybackRates(): number[] {\n return this._player ? this._player.getAvailablePlaybackRates() : [];\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoLoadedFraction */\n getVideoLoadedFraction(): number {\n return this._player ? this._player.getVideoLoadedFraction() : 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlayerState */\n getPlayerState(): YT.PlayerState | undefined {\n if (!this._isBrowser || !window.YT) {\n return undefined;\n }\n\n if (this._player) {\n return this._player.getPlayerState();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.playbackState != null) {\n return this._pendingPlayerState.playbackState;\n }\n\n return PlayerState.UNSTARTED;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getCurrentTime */\n getCurrentTime(): number {\n if (this._player) {\n return this._player.getCurrentTime();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.seek) {\n return this._pendingPlayerState.seek.seconds;\n }\n\n return 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackQuality */\n getPlaybackQuality(): YT.SuggestedVideoQuality {\n return this._player ? this._player.getPlaybackQuality() : 'default';\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getAvailableQualityLevels */\n getAvailableQualityLevels(): YT.SuggestedVideoQuality[] {\n return this._player ? this._player.getAvailableQualityLevels() : [];\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getDuration */\n getDuration(): number {\n return this._player ? this._player.getDuration() : 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoUrl */\n getVideoUrl(): string {\n return this._player ? this._player.getVideoUrl() : '';\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoEmbedCode */\n getVideoEmbedCode(): string {\n return this._player ? this._player.getVideoEmbedCode() : '';\n }\n\n /**\n * Loads the YouTube API and sets up the player.\n * @param playVideo Whether to automatically play the video once the player is loaded.\n */\n protected _load(playVideo: boolean) {\n // Don't do anything if we're not in a browser environment.\n if (!this._isBrowser) {\n return;\n }\n\n if (!window.YT || !window.YT.Player) {\n if (this.loadApi) {\n this._isLoading = true;\n loadApi(this._nonce);\n } else if (this.showBeforeIframeApiLoads && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw new Error(\n 'Namespace YT not found, cannot construct embedded youtube player. ' +\n 'Please install the YouTube Player API Reference for iframe Embeds: ' +\n 'https://developers.google.com/youtube/iframe_api_reference',\n );\n }\n\n this._existingApiReadyCallback = window.onYouTubeIframeAPIReady;\n\n window.onYouTubeIframeAPIReady = () => {\n this._existingApiReadyCallback?.();\n this._ngZone.run(() => this._createPlayer(playVideo));\n };\n } else {\n this._createPlayer(playVideo);\n }\n }\n\n /** Loads the player depending on the internal state of the component. */\n private _conditionallyLoad() {\n // If the placeholder isn't shown anymore, we have to trigger a load.\n if (!this._shouldShowPlaceholder()) {\n this._load(false);\n } else if (this.playerVars?.autoplay === 1) {\n // If it's an autoplaying video, we have to hide the placeholder and start playing.\n this._load(true);\n }\n }\n\n /** Whether to show the placeholder element. */\n protected _shouldShowPlaceholder(): boolean {\n if (this.disablePlaceholder) {\n return false;\n }\n\n // Since we don't load the API on the server, we show the placeholder permanently.\n if (!this._isBrowser) {\n return true;\n }\n\n return this._hasPlaceholder && !!this.videoId && !this._player;\n }\n\n /** Gets an object that should be used to store the temporary API state. */\n private _getPendingState(): PendingPlayerState {\n if (!this._pendingPlayerState) {\n this._pendingPlayerState = {};\n }\n\n return this._pendingPlayerState;\n }\n\n /**\n * Determines whether a change in the component state\n * requires the YouTube player to be recreated.\n */\n private _shouldRecreatePlayer(changes: SimpleChanges): boolean {\n const change =\n changes['videoId'] ||\n changes['playerVars'] ||\n changes['disableCookies'] ||\n changes['disablePlaceholder'];\n return !!change && !change.isFirstChange();\n }\n\n /**\n * Creates a new YouTube player and destroys the existing one.\n * @param playVideo Whether to play the video once it loads.\n */\n private _createPlayer(playVideo: boolean) {\n this._player?.destroy();\n this._pendingPlayer?.destroy();\n\n // A player can't be created if the API isn't loaded,\n // or there isn't a video or playlist to be played.\n if (typeof YT === 'undefined' || (!this.videoId && !this.playerVars?.list)) {\n return;\n }\n\n // Important! We need to create the Player object outside of the `NgZone`, because it kicks\n // off a 250ms setInterval which will continually trigger change detection if we don't.\n const player = this._ngZone.runOutsideAngular(\n () =>\n new YT.Player(this.youtubeContainer.nativeElement, {\n videoId: this.videoId,\n host: this.disableCookies ? 'https://www.youtube-nocookie.com' : undefined,\n width: this.width,\n height: this.height,\n // Calling `playVideo` on load doesn't appear to actually play\n // the video so we need to trigger it through `playerVars` instead.\n playerVars: playVideo ? {...(this.playerVars || {}), autoplay: 1} : this.playerVars,\n }),\n );\n\n const whenReady = () => {\n // Only assign the player once it's ready, otherwise YouTube doesn't expose some APIs.\n this._ngZone.run(() => {\n this._isLoading = false;\n this._hasPlaceholder = false;\n this._player = player;\n this._pendingPlayer = undefined;\n player.removeEventListener('onReady', whenReady);\n this._playerChanges.next(player);\n this._setSize();\n this._setQuality();\n\n if (this._pendingPlayerState) {\n this._applyPendingPlayerState(player, this._pendingPlayerState);\n this._pendingPlayerState = undefined;\n }\n\n // Only cue the player when it either hasn't started yet or it's cued,\n // otherwise cuing it can interrupt a player with autoplay enabled.\n const state = player.getPlayerState();\n if (state === PlayerState.UNSTARTED || state === PlayerState.CUED || state == null) {\n this._cuePlayer();\n }\n\n this._changeDetectorRef.markForCheck();\n });\n };\n\n this._pendingPlayer = player;\n player.addEventListener('onReady', whenReady);\n }\n\n /** Applies any state that changed before the player was initialized. */\n private _applyPendingPlayerState(player: YT.Player, pendingState: PendingPlayerState): void {\n const {playbackState, playbackRate, volume, muted, seek} = pendingState;\n\n switch (playbackState) {\n case PlayerState.PLAYING:\n player.playVideo();\n break;\n case PlayerState.PAUSED:\n player.pauseVideo();\n break;\n case PlayerState.CUED:\n player.stopVideo();\n break;\n }\n\n if (playbackRate != null) {\n player.setPlaybackRate(playbackRate);\n }\n\n if (volume != null) {\n player.setVolume(volume);\n }\n\n if (muted != null) {\n muted ? player.mute() : player.unMute();\n }\n\n if (seek != null) {\n player.seekTo(seek.seconds, seek.allowSeekAhead);\n }\n }\n\n /** Cues the player based on the current component state. */\n private _cuePlayer() {\n if (this._player && this.videoId) {\n this._player.cueVideoById({\n videoId: this.videoId,\n startSeconds: this.startSeconds,\n endSeconds: this.endSeconds,\n suggestedQuality: this.suggestedQuality,\n });\n }\n }\n\n /** Sets the player's size based on the current input values. */\n private _setSize() {\n this._player?.setSize(this.width, this.height);\n }\n\n /** Sets the player's quality based on the current input values. */\n private _setQuality() {\n if (this._player && this.suggestedQuality) {\n this._player.setPlaybackQuality(this.suggestedQuality);\n }\n }\n\n /** Gets an observable that adds an event listener to the player when a user subscribes to it. */\n private _getLazyEmitter<T extends YT.PlayerEvent>(name: keyof YT.Events): Observable<T> {\n // Start with the stream of players. This way the events will be transferred\n // over to the new player if it gets swapped out under-the-hood.\n return this._playerChanges.pipe(\n // Switch to the bound event. `switchMap` ensures that the old event is removed when the\n // player is changed. If there's no player, return an observable that never emits.\n switchMap(player => {\n return player\n ? fromEventPattern<T>(\n (listener: (event: T) => void) => {\n player.addEventListener(name, listener);\n },\n (listener: (event: T) => void) => {\n // The API seems to throw when we try to unbind from a destroyed player and it doesn't\n // expose whether the player has been destroyed so we have to wrap it in a try/catch to\n // prevent the entire stream from erroring out.\n try {\n player?.removeEventListener?.(name, listener);\n } catch {}\n },\n )\n : observableOf<T>();\n }),\n // By default we run all the API interactions outside the zone\n // so we have to bring the events back in manually when they emit.\n source =>\n new Observable<T>(observer =>\n source.subscribe({\n next: value => this._ngZone.run(() => observer.next(value)),\n error: error => observer.error(error),\n complete: () => observer.complete(),\n }),\n ),\n // Ensures that everything is cleared out on destroy.\n takeUntil(this._destroyed),\n );\n }\n}\n\nlet apiLoaded = false;\n\n/** Loads the YouTube API from a specified URL only once. */\nfunction loadApi(nonce: string | null): void {\n if (apiLoaded) {\n return;\n }\n\n // We can use `document` directly here, because this logic doesn't run outside the browser.\n const url = 'https://www.youtube.com/iframe_api';\n const script = document.createElement('script');\n const callback = (event: Event) => {\n script.removeEventListener('load', callback);\n script.removeEventListener('error', callback);\n\n if (event.type === 'error') {\n apiLoaded = false;\n\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n console.error(`Failed to load YouTube API from ${url}`);\n }\n }\n };\n script.addEventListener('load', callback);\n script.addEventListener('error', callback);\n (script as any).src = url;\n script.async = true;\n\n if (nonce) {\n script.setAttribute('nonce', nonce);\n }\n\n // Set this immediately to true so we don't start loading another script\n // while this one is pending. If loading fails, we'll flip it back to false.\n apiLoaded = true;\n document.body.appendChild(script);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {YouTubePlayer} from './youtube-player';\n\n@NgModule({\n imports: [YouTubePlayer],\n exports: [YouTubePlayer],\n})\nexport class YouTubePlayerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["observableOf"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular/youtube-player",
3
- "version": "18.2.0-next.2",
3
+ "version": "18.2.0-rc.0",
4
4
  "description": "Angular YouTube Player",
5
5
  "repository": {
6
6
  "type": "git",