@angular/youtube-player 19.0.0-next.1 → 19.0.0-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@angular/youtube-player",
|
|
3
|
-
"version": "19.0.0-next.
|
|
3
|
+
"version": "19.0.0-next.2",
|
|
4
4
|
"description": "Angular YouTube Player",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -37,8 +37,6 @@
|
|
|
37
37
|
},
|
|
38
38
|
".": {
|
|
39
39
|
"types": "./index.d.ts",
|
|
40
|
-
"esm2022": "./esm2022/youtube-player_public_index.mjs",
|
|
41
|
-
"esm": "./esm2022/youtube-player_public_index.mjs",
|
|
42
40
|
"default": "./fesm2022/youtube-player.mjs"
|
|
43
41
|
}
|
|
44
42
|
}
|
package/esm2022/index.mjs
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
export * from './public-api';
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMveW91dHViZS1wbGF5ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
package/esm2022/public-api.mjs
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
export * from './youtube-module';
|
|
9
|
-
export { YouTubePlayer, YOUTUBE_PLAYER_CONFIG } from './youtube-player';
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy95b3V0dWJlLXBsYXllci9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILGNBQWMsa0JBQWtCLENBQUM7QUFDakMsT0FBTyxFQUFDLGFBQWEsRUFBRSxxQkFBcUIsRUFBc0IsTUFBTSxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3lvdXR1YmUtbW9kdWxlJztcbmV4cG9ydCB7WW91VHViZVBsYXllciwgWU9VVFVCRV9QTEFZRVJfQ09ORklHLCBZb3VUdWJlUGxheWVyQ29uZmlnfSBmcm9tICcuL3lvdXR1YmUtcGxheWVyJztcbmV4cG9ydCB7UGxhY2Vob2xkZXJJbWFnZVF1YWxpdHl9IGZyb20gJy4veW91dHViZS1wbGF5ZXItcGxhY2Vob2xkZXInO1xuIl19
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
import { NgModule } from '@angular/core';
|
|
9
|
-
import { YouTubePlayer } from './youtube-player';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
export class 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
|
-
}
|
|
16
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerModule, decorators: [{
|
|
17
|
-
type: NgModule,
|
|
18
|
-
args: [{
|
|
19
|
-
imports: [YouTubePlayer],
|
|
20
|
-
exports: [YouTubePlayer],
|
|
21
|
-
}]
|
|
22
|
-
}] });
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW91dHViZS1tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMveW91dHViZS1wbGF5ZXIveW91dHViZS1tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7O0FBTS9DLE1BQU0sT0FBTyxtQkFBbUI7cUhBQW5CLG1CQUFtQjtzSEFBbkIsbUJBQW1CLFlBSHBCLGFBQWEsYUFDYixhQUFhO3NIQUVaLG1CQUFtQjs7a0dBQW5CLG1CQUFtQjtrQkFKL0IsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUM7b0JBQ3hCLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQztpQkFDekIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1lvdVR1YmVQbGF5ZXJ9IGZyb20gJy4veW91dHViZS1wbGF5ZXInO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbWW91VHViZVBsYXllcl0sXG4gIGV4cG9ydHM6IFtZb3VUdWJlUGxheWVyXSxcbn0pXG5leHBvcnQgY2xhc3MgWW91VHViZVBsYXllck1vZHVsZSB7fVxuIl19
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
export class YouTubePlayerPlaceholder {
|
|
11
|
-
/** Gets the background image showing the placeholder. */
|
|
12
|
-
_getBackgroundImage() {
|
|
13
|
-
let url;
|
|
14
|
-
if (this.quality === 'low') {
|
|
15
|
-
url = `https://i.ytimg.com/vi/${this.videoId}/hqdefault.jpg`;
|
|
16
|
-
}
|
|
17
|
-
else if (this.quality === 'high') {
|
|
18
|
-
url = `https://i.ytimg.com/vi/${this.videoId}/maxresdefault.jpg`;
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
url = `https://i.ytimg.com/vi_webp/${this.videoId}/sddefault.webp`;
|
|
22
|
-
}
|
|
23
|
-
return `url(${url})`;
|
|
24
|
-
}
|
|
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
|
-
<button type="button" class="youtube-player-placeholder-button" [attr.aria-label]="buttonLabel">
|
|
28
|
-
<svg
|
|
29
|
-
height="100%"
|
|
30
|
-
version="1.1"
|
|
31
|
-
viewBox="0 0 68 48"
|
|
32
|
-
focusable="false"
|
|
33
|
-
aria-hidden="true">
|
|
34
|
-
<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>
|
|
35
|
-
<path d="M 45,24 27,14 27,34" fill="#fff"></path>
|
|
36
|
-
</svg>
|
|
37
|
-
</button>
|
|
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
|
-
}
|
|
40
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayerPlaceholder, decorators: [{
|
|
41
|
-
type: Component,
|
|
42
|
-
args: [{ selector: 'youtube-player-placeholder', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
43
|
-
<button type="button" class="youtube-player-placeholder-button" [attr.aria-label]="buttonLabel">
|
|
44
|
-
<svg
|
|
45
|
-
height="100%"
|
|
46
|
-
version="1.1"
|
|
47
|
-
viewBox="0 0 68 48"
|
|
48
|
-
focusable="false"
|
|
49
|
-
aria-hidden="true">
|
|
50
|
-
<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>
|
|
51
|
-
<path d="M 45,24 27,14 27,34" fill="#fff"></path>
|
|
52
|
-
</svg>
|
|
53
|
-
</button>
|
|
54
|
-
`, standalone: true, host: {
|
|
55
|
-
'class': 'youtube-player-placeholder',
|
|
56
|
-
'[class.youtube-player-placeholder-loading]': 'isLoading',
|
|
57
|
-
'[style.background-image]': '_getBackgroundImage()',
|
|
58
|
-
'[style.width.px]': 'width',
|
|
59
|
-
'[style.height.px]': 'height',
|
|
60
|
-
}, 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}"] }]
|
|
61
|
-
}], propDecorators: { videoId: [{
|
|
62
|
-
type: Input
|
|
63
|
-
}], width: [{
|
|
64
|
-
type: Input
|
|
65
|
-
}], height: [{
|
|
66
|
-
type: Input
|
|
67
|
-
}], isLoading: [{
|
|
68
|
-
type: Input
|
|
69
|
-
}], buttonLabel: [{
|
|
70
|
-
type: Input
|
|
71
|
-
}], quality: [{
|
|
72
|
-
type: Input
|
|
73
|
-
}] } });
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW91dHViZS1wbGF5ZXItcGxhY2Vob2xkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMveW91dHViZS1wbGF5ZXIveW91dHViZS1wbGF5ZXItcGxhY2Vob2xkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7O0FBZ0MzRixNQUFNLE9BQU8sd0JBQXdCO0lBbUJuQyx5REFBeUQ7SUFDL0MsbUJBQW1CO1FBQzNCLElBQUksR0FBVyxDQUFDO1FBRWhCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMzQixHQUFHLEdBQUcsMEJBQTBCLElBQUksQ0FBQyxPQUFPLGdCQUFnQixDQUFDO1FBQy9ELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDbkMsR0FBRyxHQUFHLDBCQUEwQixJQUFJLENBQUMsT0FBTyxvQkFBb0IsQ0FBQztRQUNuRSxDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsR0FBRywrQkFBK0IsSUFBSSxDQUFDLE9BQU8saUJBQWlCLENBQUM7UUFDckUsQ0FBQztRQUVELE9BQU8sT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUN2QixDQUFDO3FIQWhDVSx3QkFBd0I7eUdBQXhCLHdCQUF3Qiw0Y0F2QnpCOzs7Ozs7Ozs7Ozs7R0FZVDs7a0dBV1Usd0JBQXdCO2tCQTNCcEMsU0FBUzsrQkFDRSw0QkFBNEIsbUJBQ3JCLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksWUFDM0I7Ozs7Ozs7Ozs7OztHQVlULGNBQ1csSUFBSSxRQUVWO3dCQUNKLE9BQU8sRUFBRSw0QkFBNEI7d0JBQ3JDLDRDQUE0QyxFQUFFLFdBQVc7d0JBQ3pELDBCQUEwQixFQUFFLHVCQUF1Qjt3QkFDbkQsa0JBQWtCLEVBQUUsT0FBTzt3QkFDM0IsbUJBQW1CLEVBQUUsUUFBUTtxQkFDOUI7OEJBSVEsT0FBTztzQkFBZixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxNQUFNO3NCQUFkLEtBQUs7Z0JBR0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKiAgUXVhbGl0eSBvZiB0aGUgcGxhY2Vob2xkZXIgaW1hZ2UuICAqL1xuZXhwb3J0IHR5cGUgUGxhY2Vob2xkZXJJbWFnZVF1YWxpdHkgPSAnaGlnaCcgfCAnc3RhbmRhcmQnIHwgJ2xvdyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3lvdXR1YmUtcGxheWVyLXBsYWNlaG9sZGVyJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ5b3V0dWJlLXBsYXllci1wbGFjZWhvbGRlci1idXR0b25cIiBbYXR0ci5hcmlhLWxhYmVsXT1cImJ1dHRvbkxhYmVsXCI+XG4gICAgICA8c3ZnXG4gICAgICAgIGhlaWdodD1cIjEwMCVcIlxuICAgICAgICB2ZXJzaW9uPVwiMS4xXCJcbiAgICAgICAgdmlld0JveD1cIjAgMCA2OCA0OFwiXG4gICAgICAgIGZvY3VzYWJsZT1cImZhbHNlXCJcbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNNjYuNTIsNy43NGMtMC43OC0yLjkzLTIuNDktNS40MS01LjQyLTYuMTlDNTUuNzksLjEzLDM0LDAsMzQsMFMxMi4yMSwuMTMsNi45LDEuNTUgQzMuOTcsMi4zMywyLjI3LDQuODEsMS40OCw3Ljc0QzAuMDYsMTMuMDUsMCwyNCwwLDI0czAuMDYsMTAuOTUsMS40OCwxNi4yNmMwLjc4LDIuOTMsMi40OSw1LjQxLDUuNDIsNi4xOSBDMTIuMjEsNDcuODcsMzQsNDgsMzQsNDhzMjEuNzktMC4xMywyNy4xLTEuNTVjMi45My0wLjc4LDQuNjQtMy4yNiw1LjQyLTYuMTlDNjcuOTQsMzQuOTUsNjgsMjQsNjgsMjRTNjcuOTQsMTMuMDUsNjYuNTIsNy43NHpcIiBmaWxsPVwiI2YwMFwiPjwvcGF0aD5cbiAgICAgICAgPHBhdGggZD1cIk0gNDUsMjQgMjcsMTQgMjcsMzRcIiBmaWxsPVwiI2ZmZlwiPjwvcGF0aD5cbiAgICAgIDwvc3ZnPlxuICAgIDwvYnV0dG9uPlxuICBgLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzdHlsZVVybDogJ3lvdXR1YmUtcGxheWVyLXBsYWNlaG9sZGVyLmNzcycsXG4gIGhvc3Q6IHtcbiAgICAnY2xhc3MnOiAneW91dHViZS1wbGF5ZXItcGxhY2Vob2xkZXInLFxuICAgICdbY2xhc3MueW91dHViZS1wbGF5ZXItcGxhY2Vob2xkZXItbG9hZGluZ10nOiAnaXNMb2FkaW5nJyxcbiAgICAnW3N0eWxlLmJhY2tncm91bmQtaW1hZ2VdJzogJ19nZXRCYWNrZ3JvdW5kSW1hZ2UoKScsXG4gICAgJ1tzdHlsZS53aWR0aC5weF0nOiAnd2lkdGgnLFxuICAgICdbc3R5bGUuaGVpZ2h0LnB4XSc6ICdoZWlnaHQnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBZb3VUdWJlUGxheWVyUGxhY2Vob2xkZXIge1xuICAvKiogSUQgb2YgdGhlIHZpZGVvIGZvciB3aGljaCB0byBzaG93IHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgQElucHV0KCkgdmlkZW9JZDogc3RyaW5nO1xuXG4gIC8qKiBXaWR0aCBvZiB0aGUgdmlkZW8gZm9yIHdoaWNoIHRvIHNob3cgdGhlIHBsYWNlaG9sZGVyLiAqL1xuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyO1xuXG4gIC8qKiBIZWlnaHQgb2YgdGhlIHZpZGVvIGZvciB3aGljaCB0byBzaG93IHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgQElucHV0KCkgaGVpZ2h0OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHZpZGVvIGlzIGN1cnJlbnRseSBiZWluZyBsb2FkZWQuICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZzogYm9vbGVhbjtcblxuICAvKiogQWNjZXNzaWJsZSBsYWJlbCBmb3IgdGhlIHBsYXkgYnV0dG9uLiAqL1xuICBASW5wdXQoKSBidXR0b25MYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBRdWFsaXR5IG9mIHRoZSBwbGFjZWhvbGRlciBpbWFnZS4gKi9cbiAgQElucHV0KCkgcXVhbGl0eTogUGxhY2Vob2xkZXJJbWFnZVF1YWxpdHk7XG5cbiAgLyoqIEdldHMgdGhlIGJhY2tncm91bmQgaW1hZ2Ugc2hvd2luZyB0aGUgcGxhY2Vob2xkZXIuICovXG4gIHByb3RlY3RlZCBfZ2V0QmFja2dyb3VuZEltYWdlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHVybDogc3RyaW5nO1xuXG4gICAgaWYgKHRoaXMucXVhbGl0eSA9PT0gJ2xvdycpIHtcbiAgICAgIHVybCA9IGBodHRwczovL2kueXRpbWcuY29tL3ZpLyR7dGhpcy52aWRlb0lkfS9ocWRlZmF1bHQuanBnYDtcbiAgICB9IGVsc2UgaWYgKHRoaXMucXVhbGl0eSA9PT0gJ2hpZ2gnKSB7XG4gICAgICB1cmwgPSBgaHR0cHM6Ly9pLnl0aW1nLmNvbS92aS8ke3RoaXMudmlkZW9JZH0vbWF4cmVzZGVmYXVsdC5qcGdgO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cmwgPSBgaHR0cHM6Ly9pLnl0aW1nLmNvbS92aV93ZWJwLyR7dGhpcy52aWRlb0lkfS9zZGRlZmF1bHQud2VicGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGB1cmwoJHt1cmx9KWA7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,602 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
// Workaround for: https://github.com/bazelbuild/rules_nodejs/issues/1265
|
|
9
|
-
/// <reference types="youtube" preserve="true" />
|
|
10
|
-
import { ChangeDetectionStrategy, Component, ElementRef, Input, NgZone, Output, ViewChild, ViewEncapsulation, Inject, PLATFORM_ID, booleanAttribute, numberAttribute, InjectionToken, inject, CSP_NONCE, ChangeDetectorRef, } from '@angular/core';
|
|
11
|
-
import { isPlatformBrowser } from '@angular/common';
|
|
12
|
-
import { Observable, of as observableOf, Subject, BehaviorSubject, fromEventPattern } from 'rxjs';
|
|
13
|
-
import { takeUntil, switchMap } from 'rxjs/operators';
|
|
14
|
-
import { YouTubePlayerPlaceholder } from './youtube-player-placeholder';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
/** Injection token used to configure the `YouTubePlayer`. */
|
|
17
|
-
export const YOUTUBE_PLAYER_CONFIG = new InjectionToken('YOUTUBE_PLAYER_CONFIG');
|
|
18
|
-
export const DEFAULT_PLAYER_WIDTH = 640;
|
|
19
|
-
export const DEFAULT_PLAYER_HEIGHT = 390;
|
|
20
|
-
/** Coercion function for time values. */
|
|
21
|
-
function coerceTime(value) {
|
|
22
|
-
return value == null ? value : numberAttribute(value, 0);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Equivalent of `YT.PlayerState` which we can't use, because it's meant to
|
|
26
|
-
* be read off the `window` which we can't do before the API has been loaded.
|
|
27
|
-
*/
|
|
28
|
-
var PlayerState;
|
|
29
|
-
(function (PlayerState) {
|
|
30
|
-
PlayerState[PlayerState["UNSTARTED"] = -1] = "UNSTARTED";
|
|
31
|
-
PlayerState[PlayerState["ENDED"] = 0] = "ENDED";
|
|
32
|
-
PlayerState[PlayerState["PLAYING"] = 1] = "PLAYING";
|
|
33
|
-
PlayerState[PlayerState["PAUSED"] = 2] = "PAUSED";
|
|
34
|
-
PlayerState[PlayerState["BUFFERING"] = 3] = "BUFFERING";
|
|
35
|
-
PlayerState[PlayerState["CUED"] = 5] = "CUED";
|
|
36
|
-
})(PlayerState || (PlayerState = {}));
|
|
37
|
-
/**
|
|
38
|
-
* Angular component that renders a YouTube player via the YouTube player
|
|
39
|
-
* iframe API.
|
|
40
|
-
* @see https://developers.google.com/youtube/iframe_api_reference
|
|
41
|
-
*/
|
|
42
|
-
export class YouTubePlayer {
|
|
43
|
-
/** Height of video player */
|
|
44
|
-
get height() {
|
|
45
|
-
return this._height;
|
|
46
|
-
}
|
|
47
|
-
set height(height) {
|
|
48
|
-
this._height = height == null || isNaN(height) ? DEFAULT_PLAYER_HEIGHT : height;
|
|
49
|
-
}
|
|
50
|
-
/** Width of video player */
|
|
51
|
-
get width() {
|
|
52
|
-
return this._width;
|
|
53
|
-
}
|
|
54
|
-
set width(width) {
|
|
55
|
-
this._width = width == null || isNaN(width) ? DEFAULT_PLAYER_WIDTH : width;
|
|
56
|
-
}
|
|
57
|
-
constructor(_ngZone, platformId) {
|
|
58
|
-
this._ngZone = _ngZone;
|
|
59
|
-
this._destroyed = new Subject();
|
|
60
|
-
this._playerChanges = new BehaviorSubject(undefined);
|
|
61
|
-
this._nonce = inject(CSP_NONCE, { optional: true });
|
|
62
|
-
this._changeDetectorRef = inject(ChangeDetectorRef);
|
|
63
|
-
this._isLoading = false;
|
|
64
|
-
this._hasPlaceholder = true;
|
|
65
|
-
this._height = DEFAULT_PLAYER_HEIGHT;
|
|
66
|
-
this._width = DEFAULT_PLAYER_WIDTH;
|
|
67
|
-
/** Whether cookies inside the player have been disabled. */
|
|
68
|
-
this.disableCookies = false;
|
|
69
|
-
/**
|
|
70
|
-
* By default the player shows a placeholder image instead of loading the YouTube API which
|
|
71
|
-
* improves the initial page load performance. This input allows for the behavior to be disabled.
|
|
72
|
-
*/
|
|
73
|
-
this.disablePlaceholder = false;
|
|
74
|
-
/**
|
|
75
|
-
* Whether the iframe will attempt to load regardless of the status of the api on the
|
|
76
|
-
* page. Set this to true if you don't want the `onYouTubeIframeAPIReady` field to be
|
|
77
|
-
* set on the global window.
|
|
78
|
-
*/
|
|
79
|
-
this.showBeforeIframeApiLoads = false;
|
|
80
|
-
/** Outputs are direct proxies from the player itself. */
|
|
81
|
-
this.ready = this._getLazyEmitter('onReady');
|
|
82
|
-
this.stateChange = this._getLazyEmitter('onStateChange');
|
|
83
|
-
this.error = this._getLazyEmitter('onError');
|
|
84
|
-
this.apiChange = this._getLazyEmitter('onApiChange');
|
|
85
|
-
this.playbackQualityChange = this._getLazyEmitter('onPlaybackQualityChange');
|
|
86
|
-
this.playbackRateChange = this._getLazyEmitter('onPlaybackRateChange');
|
|
87
|
-
const config = inject(YOUTUBE_PLAYER_CONFIG, { optional: true });
|
|
88
|
-
this.loadApi = config?.loadApi ?? true;
|
|
89
|
-
this.disablePlaceholder = !!config?.disablePlaceholder;
|
|
90
|
-
this.placeholderButtonLabel = config?.placeholderButtonLabel || 'Play video';
|
|
91
|
-
this.placeholderImageQuality = config?.placeholderImageQuality || 'standard';
|
|
92
|
-
this._isBrowser = isPlatformBrowser(platformId);
|
|
93
|
-
}
|
|
94
|
-
ngAfterViewInit() {
|
|
95
|
-
this._conditionallyLoad();
|
|
96
|
-
}
|
|
97
|
-
ngOnChanges(changes) {
|
|
98
|
-
if (this._shouldRecreatePlayer(changes)) {
|
|
99
|
-
this._conditionallyLoad();
|
|
100
|
-
}
|
|
101
|
-
else if (this._player) {
|
|
102
|
-
if (changes['width'] || changes['height']) {
|
|
103
|
-
this._setSize();
|
|
104
|
-
}
|
|
105
|
-
if (changes['suggestedQuality']) {
|
|
106
|
-
this._setQuality();
|
|
107
|
-
}
|
|
108
|
-
if (changes['startSeconds'] || changes['endSeconds'] || changes['suggestedQuality']) {
|
|
109
|
-
this._cuePlayer();
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
ngOnDestroy() {
|
|
114
|
-
this._pendingPlayer?.destroy();
|
|
115
|
-
if (this._player) {
|
|
116
|
-
this._player.destroy();
|
|
117
|
-
window.onYouTubeIframeAPIReady = this._existingApiReadyCallback;
|
|
118
|
-
}
|
|
119
|
-
this._playerChanges.complete();
|
|
120
|
-
this._destroyed.next();
|
|
121
|
-
this._destroyed.complete();
|
|
122
|
-
}
|
|
123
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#playVideo */
|
|
124
|
-
playVideo() {
|
|
125
|
-
if (this._player) {
|
|
126
|
-
this._player.playVideo();
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
this._getPendingState().playbackState = PlayerState.PLAYING;
|
|
130
|
-
this._load(true);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#pauseVideo */
|
|
134
|
-
pauseVideo() {
|
|
135
|
-
if (this._player) {
|
|
136
|
-
this._player.pauseVideo();
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
this._getPendingState().playbackState = PlayerState.PAUSED;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#stopVideo */
|
|
143
|
-
stopVideo() {
|
|
144
|
-
if (this._player) {
|
|
145
|
-
this._player.stopVideo();
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
// It seems like YouTube sets the player to CUED when it's stopped.
|
|
149
|
-
this._getPendingState().playbackState = PlayerState.CUED;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#seekTo */
|
|
153
|
-
seekTo(seconds, allowSeekAhead) {
|
|
154
|
-
if (this._player) {
|
|
155
|
-
this._player.seekTo(seconds, allowSeekAhead);
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
this._getPendingState().seek = { seconds, allowSeekAhead };
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#mute */
|
|
162
|
-
mute() {
|
|
163
|
-
if (this._player) {
|
|
164
|
-
this._player.mute();
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
this._getPendingState().muted = true;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#unMute */
|
|
171
|
-
unMute() {
|
|
172
|
-
if (this._player) {
|
|
173
|
-
this._player.unMute();
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
this._getPendingState().muted = false;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#isMuted */
|
|
180
|
-
isMuted() {
|
|
181
|
-
if (this._player) {
|
|
182
|
-
return this._player.isMuted();
|
|
183
|
-
}
|
|
184
|
-
if (this._pendingPlayerState) {
|
|
185
|
-
return !!this._pendingPlayerState.muted;
|
|
186
|
-
}
|
|
187
|
-
return false;
|
|
188
|
-
}
|
|
189
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#setVolume */
|
|
190
|
-
setVolume(volume) {
|
|
191
|
-
if (this._player) {
|
|
192
|
-
this._player.setVolume(volume);
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
this._getPendingState().volume = volume;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#getVolume */
|
|
199
|
-
getVolume() {
|
|
200
|
-
if (this._player) {
|
|
201
|
-
return this._player.getVolume();
|
|
202
|
-
}
|
|
203
|
-
if (this._pendingPlayerState && this._pendingPlayerState.volume != null) {
|
|
204
|
-
return this._pendingPlayerState.volume;
|
|
205
|
-
}
|
|
206
|
-
return 0;
|
|
207
|
-
}
|
|
208
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate */
|
|
209
|
-
setPlaybackRate(playbackRate) {
|
|
210
|
-
if (this._player) {
|
|
211
|
-
return this._player.setPlaybackRate(playbackRate);
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
this._getPendingState().playbackRate = playbackRate;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackRate */
|
|
218
|
-
getPlaybackRate() {
|
|
219
|
-
if (this._player) {
|
|
220
|
-
return this._player.getPlaybackRate();
|
|
221
|
-
}
|
|
222
|
-
if (this._pendingPlayerState && this._pendingPlayerState.playbackRate != null) {
|
|
223
|
-
return this._pendingPlayerState.playbackRate;
|
|
224
|
-
}
|
|
225
|
-
return 0;
|
|
226
|
-
}
|
|
227
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#getAvailablePlaybackRates */
|
|
228
|
-
getAvailablePlaybackRates() {
|
|
229
|
-
return this._player ? this._player.getAvailablePlaybackRates() : [];
|
|
230
|
-
}
|
|
231
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#getVideoLoadedFraction */
|
|
232
|
-
getVideoLoadedFraction() {
|
|
233
|
-
return this._player ? this._player.getVideoLoadedFraction() : 0;
|
|
234
|
-
}
|
|
235
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#getPlayerState */
|
|
236
|
-
getPlayerState() {
|
|
237
|
-
if (!this._isBrowser || !window.YT) {
|
|
238
|
-
return undefined;
|
|
239
|
-
}
|
|
240
|
-
if (this._player) {
|
|
241
|
-
return this._player.getPlayerState();
|
|
242
|
-
}
|
|
243
|
-
if (this._pendingPlayerState && this._pendingPlayerState.playbackState != null) {
|
|
244
|
-
return this._pendingPlayerState.playbackState;
|
|
245
|
-
}
|
|
246
|
-
return PlayerState.UNSTARTED;
|
|
247
|
-
}
|
|
248
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#getCurrentTime */
|
|
249
|
-
getCurrentTime() {
|
|
250
|
-
if (this._player) {
|
|
251
|
-
return this._player.getCurrentTime();
|
|
252
|
-
}
|
|
253
|
-
if (this._pendingPlayerState && this._pendingPlayerState.seek) {
|
|
254
|
-
return this._pendingPlayerState.seek.seconds;
|
|
255
|
-
}
|
|
256
|
-
return 0;
|
|
257
|
-
}
|
|
258
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackQuality */
|
|
259
|
-
getPlaybackQuality() {
|
|
260
|
-
return this._player ? this._player.getPlaybackQuality() : 'default';
|
|
261
|
-
}
|
|
262
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#getAvailableQualityLevels */
|
|
263
|
-
getAvailableQualityLevels() {
|
|
264
|
-
return this._player ? this._player.getAvailableQualityLevels() : [];
|
|
265
|
-
}
|
|
266
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#getDuration */
|
|
267
|
-
getDuration() {
|
|
268
|
-
return this._player ? this._player.getDuration() : 0;
|
|
269
|
-
}
|
|
270
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#getVideoUrl */
|
|
271
|
-
getVideoUrl() {
|
|
272
|
-
return this._player ? this._player.getVideoUrl() : '';
|
|
273
|
-
}
|
|
274
|
-
/** See https://developers.google.com/youtube/iframe_api_reference#getVideoEmbedCode */
|
|
275
|
-
getVideoEmbedCode() {
|
|
276
|
-
return this._player ? this._player.getVideoEmbedCode() : '';
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Loads the YouTube API and sets up the player.
|
|
280
|
-
* @param playVideo Whether to automatically play the video once the player is loaded.
|
|
281
|
-
*/
|
|
282
|
-
_load(playVideo) {
|
|
283
|
-
// Don't do anything if we're not in a browser environment.
|
|
284
|
-
if (!this._isBrowser) {
|
|
285
|
-
return;
|
|
286
|
-
}
|
|
287
|
-
if (!window.YT || !window.YT.Player) {
|
|
288
|
-
if (this.loadApi) {
|
|
289
|
-
this._isLoading = true;
|
|
290
|
-
loadApi(this._nonce);
|
|
291
|
-
}
|
|
292
|
-
else if (this.showBeforeIframeApiLoads && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
293
|
-
throw new Error('Namespace YT not found, cannot construct embedded youtube player. ' +
|
|
294
|
-
'Please install the YouTube Player API Reference for iframe Embeds: ' +
|
|
295
|
-
'https://developers.google.com/youtube/iframe_api_reference');
|
|
296
|
-
}
|
|
297
|
-
this._existingApiReadyCallback = window.onYouTubeIframeAPIReady;
|
|
298
|
-
window.onYouTubeIframeAPIReady = () => {
|
|
299
|
-
this._existingApiReadyCallback?.();
|
|
300
|
-
this._ngZone.run(() => this._createPlayer(playVideo));
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
else {
|
|
304
|
-
this._createPlayer(playVideo);
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
/** Loads the player depending on the internal state of the component. */
|
|
308
|
-
_conditionallyLoad() {
|
|
309
|
-
// If the placeholder isn't shown anymore, we have to trigger a load.
|
|
310
|
-
if (!this._shouldShowPlaceholder()) {
|
|
311
|
-
this._load(false);
|
|
312
|
-
}
|
|
313
|
-
else if (this.playerVars?.autoplay === 1) {
|
|
314
|
-
// If it's an autoplaying video, we have to hide the placeholder and start playing.
|
|
315
|
-
this._load(true);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
/** Whether to show the placeholder element. */
|
|
319
|
-
_shouldShowPlaceholder() {
|
|
320
|
-
if (this.disablePlaceholder) {
|
|
321
|
-
return false;
|
|
322
|
-
}
|
|
323
|
-
// Since we don't load the API on the server, we show the placeholder permanently.
|
|
324
|
-
if (!this._isBrowser) {
|
|
325
|
-
return true;
|
|
326
|
-
}
|
|
327
|
-
return this._hasPlaceholder && !!this.videoId && !this._player;
|
|
328
|
-
}
|
|
329
|
-
/** Gets an object that should be used to store the temporary API state. */
|
|
330
|
-
_getPendingState() {
|
|
331
|
-
if (!this._pendingPlayerState) {
|
|
332
|
-
this._pendingPlayerState = {};
|
|
333
|
-
}
|
|
334
|
-
return this._pendingPlayerState;
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* Determines whether a change in the component state
|
|
338
|
-
* requires the YouTube player to be recreated.
|
|
339
|
-
*/
|
|
340
|
-
_shouldRecreatePlayer(changes) {
|
|
341
|
-
const change = changes['videoId'] ||
|
|
342
|
-
changes['playerVars'] ||
|
|
343
|
-
changes['disableCookies'] ||
|
|
344
|
-
changes['disablePlaceholder'];
|
|
345
|
-
return !!change && !change.isFirstChange();
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Creates a new YouTube player and destroys the existing one.
|
|
349
|
-
* @param playVideo Whether to play the video once it loads.
|
|
350
|
-
*/
|
|
351
|
-
_createPlayer(playVideo) {
|
|
352
|
-
this._player?.destroy();
|
|
353
|
-
this._pendingPlayer?.destroy();
|
|
354
|
-
// A player can't be created if the API isn't loaded,
|
|
355
|
-
// or there isn't a video or playlist to be played.
|
|
356
|
-
if (typeof YT === 'undefined' || (!this.videoId && !this.playerVars?.list)) {
|
|
357
|
-
return;
|
|
358
|
-
}
|
|
359
|
-
// Important! We need to create the Player object outside of the `NgZone`, because it kicks
|
|
360
|
-
// off a 250ms setInterval which will continually trigger change detection if we don't.
|
|
361
|
-
const player = this._ngZone.runOutsideAngular(() => new YT.Player(this.youtubeContainer.nativeElement, {
|
|
362
|
-
videoId: this.videoId,
|
|
363
|
-
host: this.disableCookies ? 'https://www.youtube-nocookie.com' : undefined,
|
|
364
|
-
width: this.width,
|
|
365
|
-
height: this.height,
|
|
366
|
-
// Calling `playVideo` on load doesn't appear to actually play
|
|
367
|
-
// the video so we need to trigger it through `playerVars` instead.
|
|
368
|
-
playerVars: playVideo ? { ...(this.playerVars || {}), autoplay: 1 } : this.playerVars,
|
|
369
|
-
}));
|
|
370
|
-
const whenReady = () => {
|
|
371
|
-
// Only assign the player once it's ready, otherwise YouTube doesn't expose some APIs.
|
|
372
|
-
this._ngZone.run(() => {
|
|
373
|
-
this._isLoading = false;
|
|
374
|
-
this._hasPlaceholder = false;
|
|
375
|
-
this._player = player;
|
|
376
|
-
this._pendingPlayer = undefined;
|
|
377
|
-
player.removeEventListener('onReady', whenReady);
|
|
378
|
-
this._playerChanges.next(player);
|
|
379
|
-
this._setSize();
|
|
380
|
-
this._setQuality();
|
|
381
|
-
if (this._pendingPlayerState) {
|
|
382
|
-
this._applyPendingPlayerState(player, this._pendingPlayerState);
|
|
383
|
-
this._pendingPlayerState = undefined;
|
|
384
|
-
}
|
|
385
|
-
// Only cue the player when it either hasn't started yet or it's cued,
|
|
386
|
-
// otherwise cuing it can interrupt a player with autoplay enabled.
|
|
387
|
-
const state = player.getPlayerState();
|
|
388
|
-
if (state === PlayerState.UNSTARTED || state === PlayerState.CUED || state == null) {
|
|
389
|
-
this._cuePlayer();
|
|
390
|
-
}
|
|
391
|
-
this._changeDetectorRef.markForCheck();
|
|
392
|
-
});
|
|
393
|
-
};
|
|
394
|
-
this._pendingPlayer = player;
|
|
395
|
-
player.addEventListener('onReady', whenReady);
|
|
396
|
-
}
|
|
397
|
-
/** Applies any state that changed before the player was initialized. */
|
|
398
|
-
_applyPendingPlayerState(player, pendingState) {
|
|
399
|
-
const { playbackState, playbackRate, volume, muted, seek } = pendingState;
|
|
400
|
-
switch (playbackState) {
|
|
401
|
-
case PlayerState.PLAYING:
|
|
402
|
-
player.playVideo();
|
|
403
|
-
break;
|
|
404
|
-
case PlayerState.PAUSED:
|
|
405
|
-
player.pauseVideo();
|
|
406
|
-
break;
|
|
407
|
-
case PlayerState.CUED:
|
|
408
|
-
player.stopVideo();
|
|
409
|
-
break;
|
|
410
|
-
}
|
|
411
|
-
if (playbackRate != null) {
|
|
412
|
-
player.setPlaybackRate(playbackRate);
|
|
413
|
-
}
|
|
414
|
-
if (volume != null) {
|
|
415
|
-
player.setVolume(volume);
|
|
416
|
-
}
|
|
417
|
-
if (muted != null) {
|
|
418
|
-
muted ? player.mute() : player.unMute();
|
|
419
|
-
}
|
|
420
|
-
if (seek != null) {
|
|
421
|
-
player.seekTo(seek.seconds, seek.allowSeekAhead);
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
/** Cues the player based on the current component state. */
|
|
425
|
-
_cuePlayer() {
|
|
426
|
-
if (this._player && this.videoId) {
|
|
427
|
-
this._player.cueVideoById({
|
|
428
|
-
videoId: this.videoId,
|
|
429
|
-
startSeconds: this.startSeconds,
|
|
430
|
-
endSeconds: this.endSeconds,
|
|
431
|
-
suggestedQuality: this.suggestedQuality,
|
|
432
|
-
});
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
/** Sets the player's size based on the current input values. */
|
|
436
|
-
_setSize() {
|
|
437
|
-
this._player?.setSize(this.width, this.height);
|
|
438
|
-
}
|
|
439
|
-
/** Sets the player's quality based on the current input values. */
|
|
440
|
-
_setQuality() {
|
|
441
|
-
if (this._player && this.suggestedQuality) {
|
|
442
|
-
this._player.setPlaybackQuality(this.suggestedQuality);
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
/** Gets an observable that adds an event listener to the player when a user subscribes to it. */
|
|
446
|
-
_getLazyEmitter(name) {
|
|
447
|
-
// Start with the stream of players. This way the events will be transferred
|
|
448
|
-
// over to the new player if it gets swapped out under-the-hood.
|
|
449
|
-
return this._playerChanges.pipe(
|
|
450
|
-
// Switch to the bound event. `switchMap` ensures that the old event is removed when the
|
|
451
|
-
// player is changed. If there's no player, return an observable that never emits.
|
|
452
|
-
switchMap(player => {
|
|
453
|
-
return player
|
|
454
|
-
? fromEventPattern((listener) => {
|
|
455
|
-
player.addEventListener(name, listener);
|
|
456
|
-
}, (listener) => {
|
|
457
|
-
// The API seems to throw when we try to unbind from a destroyed player and it doesn't
|
|
458
|
-
// expose whether the player has been destroyed so we have to wrap it in a try/catch to
|
|
459
|
-
// prevent the entire stream from erroring out.
|
|
460
|
-
try {
|
|
461
|
-
player?.removeEventListener?.(name, listener);
|
|
462
|
-
}
|
|
463
|
-
catch { }
|
|
464
|
-
})
|
|
465
|
-
: observableOf();
|
|
466
|
-
}),
|
|
467
|
-
// By default we run all the API interactions outside the zone
|
|
468
|
-
// so we have to bring the events back in manually when they emit.
|
|
469
|
-
source => new Observable(observer => source.subscribe({
|
|
470
|
-
next: value => this._ngZone.run(() => observer.next(value)),
|
|
471
|
-
error: error => observer.error(error),
|
|
472
|
-
complete: () => observer.complete(),
|
|
473
|
-
})),
|
|
474
|
-
// Ensures that everything is cleared out on destroy.
|
|
475
|
-
takeUntil(this._destroyed));
|
|
476
|
-
}
|
|
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
|
-
@if (_shouldShowPlaceholder()) {
|
|
480
|
-
<youtube-player-placeholder
|
|
481
|
-
[videoId]="videoId!"
|
|
482
|
-
[width]="width"
|
|
483
|
-
[height]="height"
|
|
484
|
-
[isLoading]="_isLoading"
|
|
485
|
-
[buttonLabel]="placeholderButtonLabel"
|
|
486
|
-
[quality]="placeholderImageQuality"
|
|
487
|
-
(click)="_load(true)"/>
|
|
488
|
-
}
|
|
489
|
-
<div [style.display]="_shouldShowPlaceholder() ? 'none' : ''">
|
|
490
|
-
<div #youtubeContainer></div>
|
|
491
|
-
</div>
|
|
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
|
-
}
|
|
494
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: YouTubePlayer, decorators: [{
|
|
495
|
-
type: Component,
|
|
496
|
-
args: [{
|
|
497
|
-
selector: 'youtube-player',
|
|
498
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
499
|
-
encapsulation: ViewEncapsulation.None,
|
|
500
|
-
standalone: true,
|
|
501
|
-
imports: [YouTubePlayerPlaceholder],
|
|
502
|
-
template: `
|
|
503
|
-
@if (_shouldShowPlaceholder()) {
|
|
504
|
-
<youtube-player-placeholder
|
|
505
|
-
[videoId]="videoId!"
|
|
506
|
-
[width]="width"
|
|
507
|
-
[height]="height"
|
|
508
|
-
[isLoading]="_isLoading"
|
|
509
|
-
[buttonLabel]="placeholderButtonLabel"
|
|
510
|
-
[quality]="placeholderImageQuality"
|
|
511
|
-
(click)="_load(true)"/>
|
|
512
|
-
}
|
|
513
|
-
<div [style.display]="_shouldShowPlaceholder() ? 'none' : ''">
|
|
514
|
-
<div #youtubeContainer></div>
|
|
515
|
-
</div>
|
|
516
|
-
`,
|
|
517
|
-
}]
|
|
518
|
-
}], ctorParameters: () => [{ type: i0.NgZone }, { type: Object, decorators: [{
|
|
519
|
-
type: Inject,
|
|
520
|
-
args: [PLATFORM_ID]
|
|
521
|
-
}] }], propDecorators: { videoId: [{
|
|
522
|
-
type: Input
|
|
523
|
-
}], height: [{
|
|
524
|
-
type: Input,
|
|
525
|
-
args: [{ transform: numberAttribute }]
|
|
526
|
-
}], width: [{
|
|
527
|
-
type: Input,
|
|
528
|
-
args: [{ transform: numberAttribute }]
|
|
529
|
-
}], startSeconds: [{
|
|
530
|
-
type: Input,
|
|
531
|
-
args: [{ transform: coerceTime }]
|
|
532
|
-
}], endSeconds: [{
|
|
533
|
-
type: Input,
|
|
534
|
-
args: [{ transform: coerceTime }]
|
|
535
|
-
}], suggestedQuality: [{
|
|
536
|
-
type: Input
|
|
537
|
-
}], playerVars: [{
|
|
538
|
-
type: Input
|
|
539
|
-
}], disableCookies: [{
|
|
540
|
-
type: Input,
|
|
541
|
-
args: [{ transform: booleanAttribute }]
|
|
542
|
-
}], loadApi: [{
|
|
543
|
-
type: Input,
|
|
544
|
-
args: [{ transform: booleanAttribute }]
|
|
545
|
-
}], disablePlaceholder: [{
|
|
546
|
-
type: Input,
|
|
547
|
-
args: [{ transform: booleanAttribute }]
|
|
548
|
-
}], showBeforeIframeApiLoads: [{
|
|
549
|
-
type: Input,
|
|
550
|
-
args: [{ transform: booleanAttribute }]
|
|
551
|
-
}], placeholderButtonLabel: [{
|
|
552
|
-
type: Input
|
|
553
|
-
}], placeholderImageQuality: [{
|
|
554
|
-
type: Input
|
|
555
|
-
}], ready: [{
|
|
556
|
-
type: Output
|
|
557
|
-
}], stateChange: [{
|
|
558
|
-
type: Output
|
|
559
|
-
}], error: [{
|
|
560
|
-
type: Output
|
|
561
|
-
}], apiChange: [{
|
|
562
|
-
type: Output
|
|
563
|
-
}], playbackQualityChange: [{
|
|
564
|
-
type: Output
|
|
565
|
-
}], playbackRateChange: [{
|
|
566
|
-
type: Output
|
|
567
|
-
}], youtubeContainer: [{
|
|
568
|
-
type: ViewChild,
|
|
569
|
-
args: ['youtubeContainer', { static: true }]
|
|
570
|
-
}] } });
|
|
571
|
-
let apiLoaded = false;
|
|
572
|
-
/** Loads the YouTube API from a specified URL only once. */
|
|
573
|
-
function loadApi(nonce) {
|
|
574
|
-
if (apiLoaded) {
|
|
575
|
-
return;
|
|
576
|
-
}
|
|
577
|
-
// We can use `document` directly here, because this logic doesn't run outside the browser.
|
|
578
|
-
const url = 'https://www.youtube.com/iframe_api';
|
|
579
|
-
const script = document.createElement('script');
|
|
580
|
-
const callback = (event) => {
|
|
581
|
-
script.removeEventListener('load', callback);
|
|
582
|
-
script.removeEventListener('error', callback);
|
|
583
|
-
if (event.type === 'error') {
|
|
584
|
-
apiLoaded = false;
|
|
585
|
-
if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
586
|
-
console.error(`Failed to load YouTube API from ${url}`);
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
};
|
|
590
|
-
script.addEventListener('load', callback);
|
|
591
|
-
script.addEventListener('error', callback);
|
|
592
|
-
script.src = url;
|
|
593
|
-
script.async = true;
|
|
594
|
-
if (nonce) {
|
|
595
|
-
script.setAttribute('nonce', nonce);
|
|
596
|
-
}
|
|
597
|
-
// Set this immediately to true so we don't start loading another script
|
|
598
|
-
// while this one is pending. If loading fails, we'll flip it back to false.
|
|
599
|
-
apiLoaded = true;
|
|
600
|
-
document.body.appendChild(script);
|
|
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
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './index';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW91dHViZS1wbGF5ZXJfcHVibGljX2luZGV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3lvdXR1YmUtcGxheWVyL3lvdXR1YmUtcGxheWVyX3B1YmxpY19pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
|