@reveldigital/player-client 1.0.9 → 1.0.10

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.
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JldmVsZGlnaXRhbC9wbGF5ZXItY2xpZW50L3NyYy9saWIvaW50ZXJmYWNlcy9jbGllbnQuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGlnbm9yZSAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElDbGllbnQge1xyXG5cclxuICAgIGNhbGxiYWNrKC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcclxuXHJcbiAgICBnZXREZXZpY2VUaW1lKGRhdGU/OiBEYXRlKTogUHJvbWlzZTxzdHJpbmc+O1xyXG5cclxuICAgIGdldERldmljZVRpbWVab25lTmFtZSgpOiBQcm9taXNlPHN0cmluZz47XHJcblxyXG4gICAgZ2V0RGV2aWNlVGltZVpvbmVJRCgpOiBQcm9taXNlPHN0cmluZz47XHJcblxyXG4gICAgZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTogUHJvbWlzZTxudW1iZXI+O1xyXG5cclxuICAgIGdldExhbmd1YWdlQ29kZSgpOiBQcm9taXNlPHN0cmluZz47XHJcblxyXG4gICAgZ2V0RGV2aWNlS2V5KCk6IFByb21pc2U8c3RyaW5nPjtcclxuXHJcbiAgICBzZW5kQ29tbWFuZChuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZDtcclxuXHJcbiAgICBzZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZyk6IHZvaWQ7XHJcblxyXG4gICAgdHJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBzdHJpbmcpOiB2b2lkO1xyXG5cclxuICAgIHRpbWVFdmVudChldmVudE5hbWU6IHN0cmluZyk6IHZvaWQ7XHJcblxyXG4gICAgbmV3RXZlbnRTZXNzaW9uKGlkPzogc3RyaW5nKTogdm9pZDtcclxuXHJcbiAgICBnZXRSZXZlbFJvb3QoKTogUHJvbWlzZTxzdHJpbmc+O1xyXG5cclxuICAgIGdldENvbW1hbmRNYXAoKTogUHJvbWlzZTxzdHJpbmc+O1xyXG5cclxuICAgIGdldERldmljZSgpOiBQcm9taXNlPHN0cmluZz47XHJcblxyXG4gICAgZmluaXNoKCk6IHZvaWQ7XHJcbn1cclxuIl19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JldmVsZGlnaXRhbC9wbGF5ZXItY2xpZW50L3NyYy9saWIvaW50ZXJmYWNlcy9jbGllbnQuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGlnbm9yZSAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElDbGllbnQge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgdG8gdGhlIHBsYXllci5cclxuICAgICAqIFRoaXMgaXMgdGhlIHByaW1hcnkgbWV0aG9kIG9mIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgcGxheWVyLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqIEBtZW1iZXJvZiBJQ2xpZW50XHJcbiAgICAgKi9cclxuICAgIGNhbGxiYWNrKC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBkZXZpY2UgbmFtZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn1cclxuICAgICAqIEBtZW1iZXJvZiBJQ2xpZW50XHJcbiAgICAgKi9cclxuICAgIGdldERldmljZVRpbWUoZGF0ZT86IERhdGUpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGRldmljZSB0aW1lIHpvbmUgbmFtZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn1cclxuICAgICAqIEBtZW1iZXJvZiBJQ2xpZW50XHJcbiAgICAgKi9cclxuICAgIGdldERldmljZVRpbWVab25lTmFtZSgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGRldmljZSB0aW1lIHpvbmUgSURcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59XHJcbiAgICAgKiBAbWVtYmVyb2YgSUNsaWVudFxyXG4gICAgICovXHJcbiAgICBnZXREZXZpY2VUaW1lWm9uZUlEKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgZGV2aWNlIHRpbWUgem9uZSBvZmZzZXRcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgbnVsbD59XHJcbiAgICAgKiBAbWVtYmVyb2YgSUNsaWVudFxyXG4gICAgICovXHJcbiAgICBnZXREZXZpY2VUaW1lWm9uZU9mZnNldCgpOiBQcm9taXNlPG51bWJlciB8IG51bGw+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGRldmljZSBsYW5ndWFnZSBjb2RlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fVxyXG4gICAgICogQG1lbWJlcm9mIElDbGllbnRcclxuICAgICAqL1xyXG4gICAgZ2V0TGFuZ3VhZ2VDb2RlKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgZGV2aWNlIGtleVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn1cclxuICAgICAqIEBtZW1iZXJvZiBJQ2xpZW50XHJcbiAgICAgKi9cclxuICAgIGdldERldmljZUtleSgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VuZCBjb21tYW5kIHRvIGRldmljZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gbmFtZSBcclxuICAgICAqIEBwYXJhbSBhcmcgXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqIEBtZW1iZXJvZiBJQ2xpZW50XHJcbiAgICAgKi9cclxuICAgIHNlbmRDb21tYW5kKG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpOiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VuZCByZW1vdGUgY29tbWFuZCB0byBkZXZpY2VcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGRldmljZUtleXNcclxuICAgICAqIEBwYXJhbSBuYW1lXHJcbiAgICAgKiBAcGFyYW0gYXJnXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqIEBtZW1iZXJvZiBJQ2xpZW50XHJcbiAgICAgKi9cclxuICAgIHNlbmRSZW1vdGVDb21tYW5kKGRldmljZUtleXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNrIGV2ZW50XHJcbiAgICAgKiBcclxuICAgICAqIEluIHRoZSBjYXNlIG9mIGEgdGltZWQgZXZlbnQsIHRoZSBkdXJhdGlvbiBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIHRpbWVFdmVudCBjYWxsIHRvIHRoZSB0cmFjayBjYWxsLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZXZlbnROYW1lIFxyXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqIEBtZW1iZXJvZiBJQ2xpZW50XHJcbiAgICAgKi9cclxuICAgIHRyYWNrKGV2ZW50TmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzPzogc3RyaW5nKTogdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0IHRyYWNraW5nIG9mIGV2ZW50IHdpdGggZHVyYXRpb25cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZVxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKiBAbWVtYmVyb2YgSUNsaWVudFxyXG4gICAgICovXHJcbiAgICB0aW1lRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnQgYSBuZXcgc2Vzc2lvblxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gaWQgb3B0aW9uYWwgc2Vzc2lvbiBJRFxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKiBAbWVtYmVyb2YgSUNsaWVudFxyXG4gICAgICovXHJcbiAgICBuZXdFdmVudFNlc3Npb24oaWQ/OiBzdHJpbmcpOiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgUmV2ZWwgc3lzdGVtXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fVxyXG4gICAgICogQG1lbWJlcm9mIElDbGllbnRcclxuICAgICAqL1xyXG4gICAgZ2V0UmV2ZWxSb290KCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGNvbW1hbmQgbWFwXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fVxyXG4gICAgICogQG1lbWJlcm9mIElDbGllbnRcclxuICAgICAqL1xyXG4gICAgZ2V0Q29tbWFuZE1hcCgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2lnbmFscyB0byB0aGUgcGxheWVyIHRoYXQgdGhlIGNsaWVudCBpcyBmaW5pc2hlZCBhbmQgdGhlIHBsYXllciBjYW4gdHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzb3VyY2VcclxuICAgICAqL1xyXG4gICAgZmluaXNoKCk6IHZvaWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgZGV2aWNlIGluZm9ybWF0aW9uXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fVxyXG4gICAgICogQG1lbWJlcm9mIElDbGllbnRcclxuICAgICAqL1xyXG4gICAgZ2V0RGV2aWNlKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgd2lkdGggb2YgdGhlIHZpc3VhbGl6YXRpb24gYXJlYVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXIgfCBudWxsPn1cclxuICAgICAqIEBtZW1iZXJvZiBJQ2xpZW50XHJcbiAgICAgKi9cclxuICAgIGdldFdpZHRoKCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgaGVpZ2h0IG9mIHRoZSB2aXN1YWxpemF0aW9uIGFyZWFcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgbnVsbD59XHJcbiAgICAgKiBAbWVtYmVyb2YgSUNsaWVudFxyXG4gICAgICovXHJcbiAgICBnZXRIZWlnaHQoKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIGN1cnJlbnRseSBwbGF5aW5nIHNvdXJjZVxyXG4gICAgICogKG9ubHkgYXBwbGljYWJsZSB3aGVuIGFzc29jaWF0ZWQgd2l0aCBhIHBsYXlsaXN0KVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXIgfCBudWxsPn1cclxuICAgICAqIEBtZW1iZXJvZiBJQ2xpZW50XHJcbiAgICAgKi9cclxuICAgIGdldER1cmF0aW9uKCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIFNESyB2ZXJzaW9uXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fVxyXG4gICAgICogQG1lbWJlcm9mIElDbGllbnRcclxuICAgICAqL1xyXG4gICAgZ2V0U2RrVmVyc2lvbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xyXG59Il19
@@ -1,6 +1,7 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import { BehaviorSubject, fromEvent, Subject } from 'rxjs';
3
3
  import { map, share, tap } from 'rxjs/operators';
4
+ import { version } from './version';
4
5
  import * as i0 from "@angular/core";
5
6
  export class PlayerClientService {
6
7
  // private onPostMessageSub: Subscription;
@@ -316,6 +317,42 @@ export class PlayerClientService {
316
317
  });
317
318
  return device[0];
318
319
  }
320
+ /**
321
+ * Returns the width of the visualization area.
322
+ *
323
+ * @returns Width of the visualization area
324
+ */
325
+ async getWidth() {
326
+ const client = await this.getClient();
327
+ return client.getWidth();
328
+ }
329
+ /**
330
+ * Returns the height of the visualization area.
331
+ *
332
+ * @returns Height of the visualization area
333
+ */
334
+ async getHeight() {
335
+ const client = await this.getClient();
336
+ return client.getHeight();
337
+ }
338
+ /**
339
+ * Returns the duration of the currently playing source.
340
+ * (only applicable when associated with a playlist)
341
+ *
342
+ * @returns Duration of the current item in milliseconds
343
+ */
344
+ async getDuration() {
345
+ const client = await this.getClient();
346
+ return client.getDuration();
347
+ }
348
+ /**
349
+ * Returns the current SDK version.
350
+ *
351
+ * @returns SDK version
352
+ */
353
+ async getSdkVersion() {
354
+ return Promise.resolve(version);
355
+ }
319
356
  // ---
320
357
  // PRIVATE METHODS.
321
358
  // ---
@@ -413,11 +450,23 @@ class NoopClient {
413
450
  async getCommandMap() {
414
451
  return Promise.resolve('{}');
415
452
  }
453
+ finish() {
454
+ // NOOP implement, nothing to do....
455
+ }
416
456
  async getDevice() {
417
457
  return Promise.resolve(null);
418
458
  }
419
- finish() {
420
- // NOOP implement, nothing to do....
459
+ async getWidth() {
460
+ return Promise.resolve(null);
461
+ }
462
+ async getHeight() {
463
+ return Promise.resolve(null);
464
+ }
465
+ async getDuration() {
466
+ return Promise.resolve(null);
467
+ }
468
+ async getSdkVersion() {
469
+ return Promise.resolve(version);
421
470
  }
422
471
  }
423
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLWNsaWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmV2ZWxkaWdpdGFsL3BsYXllci1jbGllbnQvc3JjL2xpYi9wbGF5ZXItY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFvQmpELE1BQU0sT0FBTyxtQkFBbUI7SUFtRDlCLDBDQUEwQztJQUMxQyxpRUFBaUU7SUFDakUsMkNBQTJDO0lBQzNDLCtDQUErQztJQUMvQywrQ0FBK0M7SUFDL0Msc0RBQXNEO0lBQ3RELHdFQUF3RTtJQUN4RSxhQUFhO0lBQ2IseUJBQXlCO0lBQ3pCLEtBQUs7SUFFTCxjQUFjO0lBQ2QsWUFBWSxJQUFZO1FBMUR4Qjs7V0FFRztRQUNJLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBWSxDQUFDO1FBQzVDOztXQUVHO1FBQ0ksYUFBUSxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDOztXQUVHO1FBQ0ksYUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDaEM7O1dBRUc7UUFDSSxZQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVUvQixjQUFjO1FBQ04sZ0JBQVcsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUNsRSxLQUFLLEVBQUUsRUFDUCxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUNuQixDQUFDO1FBR0YsY0FBYztRQUNOLGVBQVUsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFF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QU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWU7UUFFMUIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWTtRQUV2QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLFdBQVcsQ0FBQyxJQUFZLEVBQUUsR0FBVztRQUUxQyxvQ0FBb0M7SUFDdEMsQ0FBQztJQUVNLGlCQUFpQixDQUFDLFVBQW9CLEVBQUUsSUFBWSxFQUFFLEdBQVc7UUFFdEUsb0NBQW9DO0lBQ3RDLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBaUIsRUFBRSxVQUFtQjtRQUVqRCxvQ0FBb0M7SUFDdEMsQ0FBQztJQUVNLFNBQVMsQ0FBQyxTQUFpQjtRQUVoQyxvQ0FBb0M7SUFDdEMsQ0FBQztJQUVNLGVBQWUsQ0FBQyxFQUFXO1FBRWhDLG9DQUFvQztJQUN0QyxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVk7UUFFdkIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYTtRQUV4QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTO1FBRXBCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sTUFBTTtRQUVYLG9DQUFvQztJQUN0QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBnYWRnZXRzIH0gZnJvbSAnQHJldmVsZGlnaXRhbC9nYWRnZXQtdHlwZXMnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb21FdmVudCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgc2hhcmUsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgSUNvbW1hbmQgfSBmcm9tICcuL2ludGVyZmFjZXMvY29tbWFuZC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBJRGV2aWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2RldmljZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBJRXZlbnRQcm9wZXJ0aWVzIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2V2ZW50LXByb3BlcnRpZXMuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgSUNsaWVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9jbGllbnQuaW50ZXJmYWNlJztcclxuXHJcblxyXG4vLyBTbyB0aGF0IFR5cGVTY3JpcHQgZG9lc24ndCBjb21wbGFpbiwgd2UncmUgZ29pbmcgdG8gYXVnbWVudCB0aGUgR0xPQkFMIC8gV0lORE9XIFxyXG4vLyBuYW1lLXNwYWNlIGRlZmluaXRpb24gdG8gaW5jbHVkZSB0aGUgVHJhY2tlciBBUEkuIFRoaXMgYWxzbyBwcm92aWRlcyB1cyB3aXRoIGEgcGxhY2VcclxuLy8gdG8gYWN0dWFsbHkgRE9DVU1FTlQgdGhlIEFQSSBzbyB0aGF0IG91ciBkZXZlbG9wZXJzIGFyZW4ndCBndWVzc2luZyBhYm91dCB3aGF0J3NcclxuLy8gYXZhaWxhYmxlIG9uIHRoZSBsaWJyYXJ5LlxyXG5cclxuLyoqIEBpZ25vcmUgKi9cclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gIHZhciBDbGllbnQ6IElDbGllbnQ7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFBsYXllckNsaWVudFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgY2xpZW50UHJvbWlzZTogUHJvbWlzZTxJQ2xpZW50PiB8IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbW1hbmRzIHNlbnQgdG8gdGhpcyBwbGF5ZXIuXHJcbiAgICovXHJcbiAgcHVibGljIG9uQ29tbWFuZCQgPSBuZXcgU3ViamVjdDxJQ29tbWFuZD4oKTtcclxuICAvKipcclxuICAgKiBTaWduYWxzIHRoZSBnYWRnZXQgaGFzIGJlZW4gbG9hZGVkIGFuZCBpcyByZWFkeSB0byBzdGFydC5cclxuICAgKi9cclxuICBwdWJsaWMgb25SZWFkeSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcclxuICAvKipcclxuICAgKiBTaWduYWxzIHRoZSBnYWRnZXQgaGFzIGJlZW4gc3RhcnRlZCBieSB0aGUgcGxheWVyLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvblN0YXJ0JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgLyoqXHJcbiAgICogU2lnbmFscyB0aGUgZ2FkZ2V0cyBoYXMgYmVlbiBzdG9wcGVkIGJ5IHRoZSBwbGF5ZXIuXHJcbiAgICovXHJcbiAgcHVibGljIG9uU3RvcCQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAvL1xyXG4gIC8vIFR3byBtZXRob2RzIGF2YWlsYWJsZSBmb3IgY2FsbGluZyBpbnRvIHRoZSBsaWJyYXJ5OlxyXG4gIC8vXHJcbiAgLy8gMSkgVXNpbmcgZGlzcGF0Y2hFdmVudCgpIHdpdGggdGhlIGZvbGxvd2luZyBjdXN0b20gZXZlbnRzXHJcbiAgLy8gMikgVXNpbmcgdGhlIHdpbmRvdyBzY29wZWQgUmV2ZWxEaWdpdGFsIG9iamVjdCBhcyBkZWZpbmVkIGluIHRoZSBjb25zdHJ1Y3RvclxyXG4gIC8vXHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIG9uU3RhcnRTdWI6IFN1YnNjcmlwdGlvbjtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgb25TdGFydEV2dCQgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdSZXZlbERpZ2l0YWwuU3RhcnQnKS5waXBlKFxyXG4gICAgc2hhcmUoKSxcclxuICAgIHRhcCh0aGlzLm9uU3RhcnQkKVxyXG4gICk7XHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIG9uU3RvcFN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBvblN0b3BFdnQkID0gZnJvbUV2ZW50KGRvY3VtZW50LCAnUmV2ZWxEaWdpdGFsLlN0b3AnKS5waXBlKFxyXG4gICAgc2hhcmUoKSxcclxuICAgIHRhcCh0aGlzLm9uU3RvcCQpXHJcbiAgKTtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgb25Db21tYW5kU3ViOiBTdWJzY3JpcHRpb247XHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIG9uQ29tbWFuZEV2dCQgPSBmcm9tRXZlbnQ8SUNvbW1hbmQ+KGRvY3VtZW50LCAnUmV2ZWxEaWdpdGFsLkNvbW1hbmQnKS5waXBlKFxyXG4gICAgbWFwKChlOiBhbnkpID0+IHsgcmV0dXJuIHsgbmFtZTogZS5kZXRhaWwubmFtZSwgYXJnOiBlLmRldGFpbC5hcmcgfSBhcyBJQ29tbWFuZCB9KSxcclxuICAgIHNoYXJlKCksXHJcbiAgICB0YXAodGhpcy5vbkNvbW1hbmQkKVxyXG4gICk7XHJcblxyXG4gIC8vIHByaXZhdGUgb25Qb3N0TWVzc2FnZVN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIC8vIHByaXZhdGUgb25Qb3N0TWVzc2FnZUV2dCQgPSBmcm9tRXZlbnQod2luZG93LCAnbWVzc2FnZScpLnBpcGUoXHJcbiAgLy8gICBmaWx0ZXIoKG1lc3NhZ2VFdmVudDogTWVzc2FnZUV2ZW50KSA9PlxyXG4gIC8vICAgICBtZXNzYWdlRXZlbnQuc291cmNlICE9PSB3aW5kb3cucGFyZW50ICYmXHJcbiAgLy8gICAgIHR5cGVvZiBtZXNzYWdlRXZlbnQuZGF0YSA9PT0gJ3N0cmluZycgJiZcclxuICAvLyAgICAgbWVzc2FnZUV2ZW50LmRhdGEuc3RhcnRzV2l0aCgncmV2ZWxkaWdpdGFsOicpKSxcclxuICAvLyAgIG1hcCgoZTogYW55KSA9PiB7IHJldHVybiBKU09OLnBhcnNlKGUuc3Vic3RyaW5nKDEzKSkgYXMgQ29tbWFuZCB9KSxcclxuICAvLyAgIHNoYXJlKCksXHJcbiAgLy8gICB0YXAodGhpcy5vbkNvbW1hbmQkKVxyXG4gIC8vICk7XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgY29uc3RydWN0b3Ioem9uZTogTmdab25lKSB7XHJcblxyXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLlJldmVsRGlnaXRhbCA9IHtcclxuICAgICAgQ29udHJvbGxlcjoge1xyXG4gICAgICAgIG9uQ29tbWFuZDogZnVuY3Rpb24gKG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpIHtcclxuICAgICAgICAgIHpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgc2VsZi5vbkNvbW1hbmQkLm5leHQoeyBuYW1lOiBuYW1lLCBhcmc6IGFyZyB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25TdGFydDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBzZWxmLm9uU3RhcnQkLm5leHQobnVsbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uU3RvcDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBzZWxmLm9uU3RvcCQubmV4dChudWxsKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub25TdGFydFN1YiA9IHRoaXMub25TdGFydEV2dCQuc3Vic2NyaWJlKCgpID0+IHsgfSk7XHJcbiAgICB0aGlzLm9uU3RvcFN1YiA9IHRoaXMub25TdG9wRXZ0JC5zdWJzY3JpYmUoKCkgPT4geyB9KTtcclxuICAgIHRoaXMub25Db21tYW5kU3ViID0gdGhpcy5vbkNvbW1hbmRFdnQkLnN1YnNjcmliZSgoKSA9PiB7IH0pO1xyXG5cclxuICAgIHRoaXMuY2xpZW50UHJvbWlzZSA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5vblJlYWR5JC5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLm9uU3RhcnRTdWI/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLm9uU3RvcFN1Yj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMub25Db21tYW5kU3ViPy51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMub25SZWFkeSQubmV4dChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgaW5pdChkYXRhOiBhbnkpIHtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgJyVj4pqZ77iPIEluaXRpYWxpemluZyBSZXZlbCBEaWdpdGFsIGNsaWVudCBsaWJyYXJ5JyxcclxuICAgICAgJ2JhY2tncm91bmQtY29sb3I6Ymx1ZTsgY29sb3I6eWVsbG93OydcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIGdhZGdldCB0byBjb21tdW5pY2F0ZSB3aXRoIHBsYXllciBzY3JpcHRpbmcuXHJcbiAgICogSWYgdGhlIGFwcHJvcHJpYXRlIHNjcmlwdGluZyBpcyBpbiBwbGFjZSBpbiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVtcGxhdGUsIGNhbGxpbmcgdGhpcyBtZXRob2RcclxuICAgKiB3aWxsIGluaXRpYXRlIGEgY2FsbGJhY2sgd2hpY2ggY2FuIGJlIGFjdGVkIHVwb24gaW4gcGxheWVyIHNjcmlwdC5cclxuICAgKiBcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGNsaWVudC5jYWxsYmFjaygndGVzdCcsICd0aGlzJyk7XHJcbiAgICogXHJcbiAgICogQHBhcmFtIGFyZ3MgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50c1xyXG4gICAqL1xyXG4gIHB1YmxpYyBjYWxsYmFjayguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcblxyXG4gICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgY2xpZW50LmNhbGxiYWNrKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1swXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1sxXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1syXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1szXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1s0XSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFjY2Vzc29yIG1ldGhvZCBmb3IgdGhlIHVzZXIgcHJlZmVyZW5jZXMgaW50ZXJmYWNlIGV4cG9zZWQgYnkgdGhlIEdhZGdldHMgQVBJLlxyXG4gICAqIFxyXG4gICAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vZ2FkZ2V0cy9kb2NzL2Jhc2ljfSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBHYWRnZXRzIEFQSS5cclxuICAgKiBcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGllbnQ6IFBsYXllckNsaWVudFNlcnZpY2UpIHtcclxuICAgKiAgICAgICAgICAgIGxldCBwcmVmcyA9IGNsaWVudC5nZXRQcmVmcygpO1xyXG4gICAqICAgICAgICAgICAgbGV0IG15U3RyaW5nID0gcHJlZnMuZ2V0U3RyaW5nKCdteVN0cmluZ1ByZWYnKTtcclxuICAgKiB9XHJcbiAgICogQHJldHVybnMge2dhZGdldHMuUHJlZnN9IEdhZGdldCBBUEkgUHJlZnMgb2JqZWN0XHJcbiAgICovXHJcbiAgcHVibGljIGdldFByZWZzKCk6IGdhZGdldHMuUHJlZnMge1xyXG5cclxuICAgIHJldHVybiBuZXcgd2luZG93WydnYWRnZXRzJ11bJ1ByZWZzJ10oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZGV2aWNlIHRpbWUgaW4gSVNPODYwMSBmb3JtYXQuXHJcbiAgICogQ3VycmVudCBkZXZpY2UgdGltZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBkZXZpY2UgdGltZXpvbmUgYXNzaWduZWQgdG8gdGhlIGRldmljZSBpbiB0aGUgQ01TLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBkYXRlIE9wdGlvbmFsLiBJZiBzdXBwbGllZCB3aWxsIHRyYW5zbGF0ZSB0aGUgc3VwcGxpZWQgZGF0ZS90aW1lIHRvIGRldmljZSB0aW1lIGJhc2VkIG9uIHJlc3BlY3RpdmUgdGltZXpvbmVzLlxyXG4gICAqIEByZXR1cm5zIERhdGUvdGltZSBpbiBJU084NjAxIGZvcm1hdFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lKGRhdGU/OiBEYXRlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIGlmIChkYXRlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lKGRhdGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSB0aW1lem9uZSBuYW1lIGN1cnJlbnRseSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFRpbWV6b25lIE5hbWVcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gY2xpZW50LmdldERldmljZVRpbWVab25lTmFtZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdGltZXpvbmUgSUQgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBkZXZpY2UuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgVGltZXpvbmUgSURcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVJRCgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lWm9uZUlEKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBudW1lcmljYWwgb2Zmc2V0IGZyb20gR01UIG9mIHRoZSB0aW1lem9uZSBjdXJyZW50bHkgYXNzaWduZWQgdG8gdGhlIGRldmljZS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBUaW1lem9uZSBvZmZzZXRcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTogUHJvbWlzZTxudW1iZXI+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGxhbmd1YWdlIGNvZGUgb2YgdGhlIGxhbmd1YWdlIGN1cnJlbnRseSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIExhbmd1YWdlIGNvZGVcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0TGFuZ3VhZ2VDb2RlKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gY2xpZW50LmdldExhbmd1YWdlQ29kZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdW5pcXVlIFJldmVsIERpZ2l0YWwgZGV2aWNlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBEZXZpY2Uga2V5XHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZUtleSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VLZXkoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBwbGF5ZXIgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBuYW1lIENvbW1hbmQgbmFtZVxyXG4gICAqIEBwYXJhbSBhcmcgQ29tbWFuZCBhcmd1bWVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZW5kQ29tbWFuZChuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcclxuICAgICAgY2xpZW50LnNlbmRDb21tYW5kKG5hbWUsIGFyZyk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBhIGNvbW1hbmQgdG8gYW55IHJlbW90ZSBwbGF5ZXIgd2l0aCB0aGUgc3VwcGxpZWQgZGV2aWNlIGtleShzKS5cclxuICAgKiBOb3RlOiBSZW1vdGUgY29tbWFuZHMgY2FuIG9ubHkgYmUgZGVsaXZlcmVkIHRvIGRldmljZXMgd2l0aGluIHRoZSBzYW1lIGFjY291bnQgYXMgdGhlIHNlbmRlciBkZXZpY2UuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGRldmljZUtleXMgQXJyYXkgb2YgcmVtb3RlIGRldmljZSBrZXlzXHJcbiAgICogQHBhcmFtIG5hbWUgQ29tbWFuZCBuYW1lXHJcbiAgICogQHBhcmFtIGFyZyBDb21tYW5kIGFyZ1xyXG4gICAqL1xyXG4gIHB1YmxpYyBzZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcbiAgICAgIGNsaWVudC5zZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzLCBuYW1lLCBhcmcpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2cgYW4gZXZlbnQgZm9yIHVzZSB3aXRoIEFkSGF3ayBhbmFseXRpY3MuXHJcbiAgICogRXZlbnRzIGFyZSB1c2VkIGZvciB0cmFja2luZyB2YXJpb3VzIG1ldHJpY3MgaW5jbHVkaW5nIHVzYWdlIHN0YXRpc3RpY3MsIHBsYXllciBjb25kaXRpb24sIHN0YXRlIGNoYW5nZXMsIGV0Yy5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gZXZlbnROYW1lIFVuaXF1ZSBuYW1lIGZvciB0aGlzIGV2ZW50XHJcbiAgICogQHBhcmFtIHByb3BlcnRpZXMgQSBtYXAgb2YgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBldmVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyB0cmFjayhldmVudE5hbWU6IHN0cmluZywgcHJvcGVydGllcz86IElFdmVudFByb3BlcnRpZXMpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xyXG4gICAgICBjbGllbnQudHJhY2soZXZlbnROYW1lLCBKU09OLnN0cmluZ2lmeShwcm9wZXJ0aWVzKSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0aG9kIGZvciBpbml0aWF0aW5nIGEgdGltZWQgZXZlbnQuXHJcbiAgICogVGltZWQgZXZlbnRzIGFyZSB1c2VmdWwgZm9yIHRyYWNraW5nIHRoZSBkdXJhdGlvbiBvZiBhbiBldmVudCBhbmQgbXVzdCBiZSBwcm9jZWVkZWQgd2l0aCBhIGNhbGwgdG8gdHJhY2soKS5cclxuICAgKiBcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGNsaWVudC50aW1lRXZlbnQoJ3Rlc3RFdmVudCcpO1xyXG4gICAqIGNsaWVudC50cmFjayhcInRlc3RcIiwgeyBcImFcIjogXCJiXCIgfSk7XHJcbiAgICogQHBhcmFtIGV2ZW50TmFtZSBVbmlxdWUgbmFtZSBmb3IgdGhpcyBldmVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyB0aW1lRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xyXG4gICAgICBjbGllbnQudGltZUV2ZW50KGV2ZW50TmFtZSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBzZXNzaW9uIGlzIGEgd2F5IG9mIGdyb3VwaW5nIGV2ZW50cyB0b2dldGhlci4gRWFjaCBldmVudCBoYXMgYW4gYXNzb2NpYXRlZCBzZXNzaW9uIElELlxyXG4gICAqIFNlc3Npb24gSUQncyBhcmUgcmFuZG9tbHkgZ2VuZXJhdGVkIGFuZCByZXNldCBieSBzdWJzZXF1ZW50IGNhbGxzIHRvIG5ld0V2ZW50U2Vzc2lvbigpLlxyXG4gICAqIFxyXG4gICAqIEVhY2ggY2FsbCB0byB0cmFjaygpIHdpbGwgdXRpbGl6ZSB0aGUgc2FtZSBzZXNzaW9uIElELCB1bnRpbCBhbm90aGVyIGNhbGwgdG8gbmV3RXZlbnRTZXNzaW9uKCkuXHJcbiAgICogQHBhcmFtIGlkIE9wdGlvbmFsLiBVc2VyIHN1cHBsaWVkIHNlc3Npb24gSUQuIElmIG5vdCBzdXBwbGllZCBhIHJhbmRvbSBzZXNzaW9uIElEIHdpbGwgYmUgZ2VuZXJhdGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBuZXdFdmVudFNlc3Npb24oaWQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xyXG4gICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNsaWVudC5uZXdFdmVudFNlc3Npb24oKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjbGllbnQubmV3RXZlbnRTZXNzaW9uKGlkKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHJvb3QgZm9sZGVyIHV0aWxpemVkIGJ5IHRoaXMgcGxheWVyIGRldmljZS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBQYXRoIHRvIHRoZSByb290IGZvbGRlclxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXRSZXZlbFJvb3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIHJldHVybiBjbGllbnQuZ2V0UmV2ZWxSb290KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgbWFwIG9mIGNvbW1hbmRzIGN1cnJlbnRseSBhY3RpdmUgZm9yIHRoaXMgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIE1hcCBvZiBjb21tYW5kcyBjdXJyZW50bHkgYWN0aXZlIGZvciB0aGlzIGRldmljZS5cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0Q29tbWFuZE1hcCgpOiBQcm9taXNlPGFueT4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgY2xpZW50LmdldENvbW1hbmRNYXAoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbmRpY2F0ZSB0byB0aGUgcGxheWVyIHRoYXQgdGhpcyBnYWRnZXQgaGFzIGZpbmlzaGVkIGl0J3MgdmlzdWFsaXphdGlvbi5cclxuICAgKiBUaGlzIGFsbG93cyB0aGUgcGxheWVyIHRvIHByb2NlZWQgd2l0aCB0aGUgbmV4dCBpdGVtIGluIGEgcGxheWxpc3QgaWYgYXBwbGljYWJsZS5cclxuICAgKi9cclxuICBwdWJsaWMgZmluaXNoKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcblxyXG4gICAgICBjbGllbnQuZmluaXNoKCk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaXMgdGhlIGdhZGdldCBpcyBydW5uaW5nIGluIHByZXZpZXcgbW9kZS4gUHJldmlldyBtb2RlIGlzIGVuYWJsZWQgd2hlbiB0aGUgZ2FkZ2V0IGlzXHJcbiAgICogYmVpbmcgZWRpdGVkIGluIHRoZSBDTVMsIG9yIG90aGVyd2lzZSBub3QgcnVubmluZyBpbiBhIG5vcm1hbCBwbGF5ZXIgZW52aXJvbm1lbnQuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZ2FkZ2V0IGlzIHJ1bm5pbmcgaW4gcHJldmlldyBtb2RlLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGlzUHJldmlld01vZGUoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gY2xpZW50IGluc3RhbmNlb2YgTm9vcENsaWVudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkZXZpY2UgZGV0YWlscyBhc3NvY2lhdGVkIHdpdGggdGhlIHBsYXllciBydW5uaW5nIHRoZSBnYWRnZXQgb3Igd2ViIGFwcC5cclxuICogXHJcbiAqIEByZXR1cm5zIERldmljZSBkZXRhaWxzLlxyXG4gKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlKCk6IFByb21pc2U8SURldmljZSB8IG51bGw+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIGxldCBvYmo6IGFueSA9IEpTT04ucGFyc2UoPHN0cmluZz5hd2FpdCBjbGllbnQuZ2V0RGV2aWNlKCkpO1xyXG5cclxuICAgIGNvbnN0IGRldmljZTogSURldmljZVtdID0gW29ial0ubWFwKChkZXZpY2U6IGFueSkgPT4ge1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBuYW1lOiBkZXZpY2UubmFtZSxcclxuICAgICAgICByZWdpc3RyYXRpb25LZXk6IGRldmljZS5rZXksXHJcbiAgICAgICAgZGV2aWNlVHlwZTogZGV2aWNlLmRldmljZXR5cGUsXHJcbiAgICAgICAgZW50ZXJlZFNlcnZpY2U6IG5ldyBEYXRlKGRldmljZS5lbnRlcmVkc2VydmljZSksXHJcbiAgICAgICAgbGFuZ0NvZGU6IGRldmljZS5sYW5nY29kZSxcclxuICAgICAgICB0aW1lWm9uZTogZGV2aWNlLnRpbWV6b25lLFxyXG4gICAgICAgIHRhZ3M6IGRldmljZS5kZXNjcmlwdGlvbj8uc3BsaXQoJ1xcbicpLFxyXG4gICAgICAgIGxvY2F0aW9uOiB7XHJcbiAgICAgICAgICBjaXR5OiBkZXZpY2UubG9jYXRpb24/LmNpdHksXHJcbiAgICAgICAgICBzdGF0ZTogZGV2aWNlLmxvY2F0aW9uPy5zdGF0ZSxcclxuICAgICAgICAgIGNvdW50cnk6IGRldmljZS5sb2NhdGlvbj8uY291bnRyeSxcclxuICAgICAgICAgIHBvc3RhbENvZGU6IGRldmljZS5sb2NhdGlvbj8ucG9zdGFsY29kZSxcclxuICAgICAgICAgIGFkZHJlc3M6IGRldmljZS5sb2NhdGlvbj8uYWRkcmVzcyxcclxuICAgICAgICAgIGxhdGl0dWRlOiBkZXZpY2UubG9jYXRpb24/LmxhdGl0dWRlLFxyXG4gICAgICAgICAgbG9uZ2l0dWRlOiBkZXZpY2UubG9jYXRpb24/LmxvbmdpdHVkZVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGV2aWNlWzBdO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tXHJcbiAgLy8gUFJJVkFURSBNRVRIT0RTLlxyXG4gIC8vIC0tLVxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBnZXRDbGllbnQoKTogUHJvbWlzZTxJQ2xpZW50PiB7XHJcblxyXG4gICAgaWYgKHRoaXMuY2xpZW50UHJvbWlzZSkge1xyXG5cclxuICAgICAgcmV0dXJuICh0aGlzLmNsaWVudFByb21pc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh3aW5kb3cuQ2xpZW50KSB7XHJcblxyXG4gICAgICByZXR1cm4gKHRoaXMuY2xpZW50UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh3aW5kb3cuQ2xpZW50KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQSBcImNvbXBsZXRlXCIgc3RhdHVzIGluZGljYXRlcyB0aGF0IHRoZSBcImxvYWRcIiBldmVudCBoYXMgYmVlbiBmaXJlZCBvbiB0aGVcclxuICAgIC8vIHdpbmRvdzsgYW5kLCB0aGF0IGFsbCBzdWItcmVzb3VyY2VzIHN1Y2ggYXMgU2NyaXB0cywgSW1hZ2VzLCBhbmQgRnJhbWVzIGhhdmVcclxuICAgIC8vIGJlZW4gbG9hZGVkLlxyXG4gICAgaWYgKHdpbmRvdy5kb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIpIHtcclxuXHJcbiAgICAgIC8vIElmIHRoaXMgZXZlbnQgaGFzIGZpcmVkIEFORCB0aGUgM3JkLXBhcnR5IHNjcmlwdCBpc24ndCBhdmFpbGFibGUgKHNlZSBJRi1cclxuICAgICAgLy8gY29uZGl0aW9uIEJFRk9SRSB0aGlzIG9uZSksIGl0IG1lYW5zIHRoYXQgdGhlIDNyZC1wYXJ0eSBzY3JpcHQgZWl0aGVyXHJcbiAgICAgIC8vIGZhaWxlZCBvbiB0aGUgbmV0d29yayBvciB3YXMgQkxPQ0tFRCBieSBhbiBhZC1ibG9ja2VyLiBBcyBzdWNoLCB3ZSBoYXZlIHRvXHJcbiAgICAgIC8vIGZhbGwtYmFjayB0byB1c2luZyBhIG1vY2sgQVBJLlxyXG4gICAgICByZXR1cm4gKHRoaXMuY2xpZW50UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShuZXcgTm9vcENsaWVudCgpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQVNTRVJUOiBJZiB3ZSBtYWRlIGl0IHRoaXMgZmFyLCB0aGUgZG9jdW1lbnQgaGFzIG5vdCBjb21wbGV0ZWQgbG9hZGluZyAoYnV0IGl0XHJcbiAgICAvLyBtYXkgYmUgaW4gYW4gXCJpbnRlcmFjdGl2ZVwiIHN0YXRlIHdoaWNoIGlzIHdoZW4gSSBiZWxpZXZlIHRoYXQgdGhlIEFuZ3VsYXIgYXBwXHJcbiAgICAvLyBnZXRzIGJvb3RzdHJhcHBlZCkuIEFzIHN1Y2gsIHdlIG5lZWQgYmluZCB0byB0aGUgTE9BRCBldmVudCB0byB3YWl0IGZvciBvdXJcclxuICAgIC8vIHRoaXJkLXBhcnR5IHNjcmlwdHMgdG8gbG9hZCAob3IgZmFpbCB0byBsb2FkLCBvciBiZSBibG9ja2VkKS5cclxuICAgIHRoaXMuY2xpZW50UHJvbWlzZSA9IG5ldyBQcm9taXNlPElDbGllbnQ+KFxyXG4gICAgICAocmVzb2x2ZSkgPT4ge1xyXG5cclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcclxuICAgICAgICAgIFwibG9hZFwiLFxyXG4gICAgICAgICAgZnVuY3Rpb24gaGFuZGxlV2luZG93TG9hZCgpIHtcclxuXHJcbiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSAzcmQtcGFydHkgbGlicmFyeSBpcyBlaXRoZXIgYXZhaWxhYmxlIG9yXHJcbiAgICAgICAgICAgIC8vIGl0J3Mgbm90IC0gdGhlcmUncyBubyBmdXJ0aGVyIGxvYWRpbmcgdG8gZG8uIElmIGl0J3Mgbm90XHJcbiAgICAgICAgICAgIC8vIHByZXNlbnQgb24gdGhlIGdsb2JhbCBzY29wZSwgd2UncmUgZ29pbmcgdG8gZmFsbC1iYWNrIHRvIHVzaW5nXHJcbiAgICAgICAgICAgIC8vIGEgbW9jayBBUEkuXHJcbiAgICAgICAgICAgIHJlc29sdmUod2luZG93LkNsaWVudCB8fCBuZXcgTm9vcENsaWVudCgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gKHRoaXMuY2xpZW50UHJvbWlzZSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xyXG5cclxuLy8gSSBwcm92aWRlIGEgbW9jayBBUEkgZm9yIHRoZSAzcmQtcGFydHkgc2NyaXB0LiBUaGlzIGp1c3QgYWxsb3dzIHRoZSBjb25zdW1pbmcgY29kZSB0b1xyXG4vLyBhY3QgYXMgdGhvdWdoIHRoZSBsaWJyYXJ5IGlzIGF2YWlsYWJsZSBldmVuIGlmIGl0IGZhaWxlZCB0byBsb2FkIChleGFtcGxlLCBpdCB3YXNcclxuLy8gYmxvY2tlZCBieSBhbiBhZC1ibG9ja2VyKS5cclxuXHJcbi8qKiBAaWdub3JlICovXHJcbmNsYXNzIE5vb3BDbGllbnQgaW1wbGVtZW50cyBJQ2xpZW50IHtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgY29uc29sZS5sb2coXHJcbiAgICAgICclY0NsaWVudCBBUEkgbm90IGF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvIG1vY2sgQVBJJyxcclxuICAgICAgJ2JhY2tncm91bmQtY29sb3I6Ymx1ZTsgY29sb3I6eWVsbG93OydcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FsbGJhY2soLi4uYXJnczogYW55W10pOiB2b2lkIHtcclxuXHJcbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREZXZpY2VUaW1lKGRhdGU/OiBEYXRlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lWm9uZUlEKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lWm9uZU9mZnNldCgpOiBQcm9taXNlPG51bWJlcj4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0TGFuZ3VhZ2VDb2RlKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VLZXkoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbmRDb21tYW5kKG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZykge1xyXG5cclxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxyXG4gIH1cclxuXHJcbiAgcHVibGljIHRyYWNrKGV2ZW50TmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzPzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdGltZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmV3RXZlbnRTZXNzaW9uKGlkPzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0UmV2ZWxSb290KCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRDb21tYW5kTWFwKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgne30nKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2UoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmaW5pc2goKTogdm9pZCB7XHJcblxyXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXHJcbiAgfVxyXG59XHJcbiJdfQ==
472
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLWNsaWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmV2ZWxkaWdpdGFsL3BsYXllci1jbGllbnQvc3JjL2xpYi9wbGF5ZXItY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUtqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDOztBQWlCcEMsTUFBTSxPQUFPLG1CQUFtQjtJQW1EOUIsMENBQTBDO0lBQzFDLGlFQUFpRTtJQUNqRSwyQ0FBMkM7SUFDM0MsK0NBQStDO0lBQy9DLCtDQUErQztJQUMvQyxzREFBc0Q7SUFDdEQsd0VBQXdFO0lBQ3hFLGFBQWE7SUFDYix5QkFBeUI7SUFDekIsS0FBSztJQUVMLGNBQWM7SUFDZCxZQUFZLElBQVk7UUExRHhCOztXQUVHO1FBQ0ksZUFBVSxHQUFHLElBQUksT0FBTyxFQUFZLENBQUM7UUFDNUM7O1dBRUc7UUFDSSxhQUFRLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0M7O1dBRUc7UUFDSSxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNoQzs7V0FFRztRQUNJLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBVS9CLGNBQWM7UUFDTixnQkFBVyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQ2xFLEtBQUssRUFBRSxFQUNQLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ25CLENBQUM7UUFH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Q0FBQyxTQUFpQjtRQUVoQyxvQ0FBb0M7SUFDdEMsQ0FBQztJQUVNLGVBQWUsQ0FBQyxFQUFXO1FBRWhDLG9DQUFvQztJQUN0QyxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVk7UUFFdkIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYTtRQUV4QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU07UUFFWCxvQ0FBb0M7SUFDdEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTO1FBRXBCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVE7UUFFbkIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUztRQUVwQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXO1FBRXRCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWE7UUFFeEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGdhZGdldHMgfSBmcm9tICdAcmV2ZWxkaWdpdGFsL2dhZGdldC10eXBlcyc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbUV2ZW50LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCBzaGFyZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBJQ29tbWFuZCB9IGZyb20gJy4vaW50ZXJmYWNlcy9jb21tYW5kLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IElEZXZpY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvZGV2aWNlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IElFdmVudFByb3BlcnRpZXMgfSBmcm9tICcuL2ludGVyZmFjZXMvZXZlbnQtcHJvcGVydGllcy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBJQ2xpZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NsaWVudC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJztcclxuXHJcbi8vaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi5qcyc7XHJcblxyXG4vLyBTbyB0aGF0IFR5cGVTY3JpcHQgZG9lc24ndCBjb21wbGFpbiwgd2UncmUgZ29pbmcgdG8gYXVnbWVudCB0aGUgR0xPQkFMIC8gV0lORE9XIFxyXG4vLyBuYW1lLXNwYWNlIGRlZmluaXRpb24gdG8gaW5jbHVkZSB0aGUgVHJhY2tlciBBUEkuIFRoaXMgYWxzbyBwcm92aWRlcyB1cyB3aXRoIGEgcGxhY2VcclxuLy8gdG8gYWN0dWFsbHkgRE9DVU1FTlQgdGhlIEFQSSBzbyB0aGF0IG91ciBkZXZlbG9wZXJzIGFyZW4ndCBndWVzc2luZyBhYm91dCB3aGF0J3NcclxuLy8gYXZhaWxhYmxlIG9uIHRoZSBsaWJyYXJ5LlxyXG5cclxuLyoqIEBpZ25vcmUgKi9cclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gIHZhciBDbGllbnQ6IElDbGllbnQ7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFBsYXllckNsaWVudFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgY2xpZW50UHJvbWlzZTogUHJvbWlzZTxJQ2xpZW50PiB8IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbW1hbmRzIHNlbnQgdG8gdGhpcyBwbGF5ZXIuXHJcbiAgICovXHJcbiAgcHVibGljIG9uQ29tbWFuZCQgPSBuZXcgU3ViamVjdDxJQ29tbWFuZD4oKTtcclxuICAvKipcclxuICAgKiBTaWduYWxzIHRoZSBnYWRnZXQgaGFzIGJlZW4gbG9hZGVkIGFuZCBpcyByZWFkeSB0byBzdGFydC5cclxuICAgKi9cclxuICBwdWJsaWMgb25SZWFkeSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcclxuICAvKipcclxuICAgKiBTaWduYWxzIHRoZSBnYWRnZXQgaGFzIGJlZW4gc3RhcnRlZCBieSB0aGUgcGxheWVyLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvblN0YXJ0JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgLyoqXHJcbiAgICogU2lnbmFscyB0aGUgZ2FkZ2V0cyBoYXMgYmVlbiBzdG9wcGVkIGJ5IHRoZSBwbGF5ZXIuXHJcbiAgICovXHJcbiAgcHVibGljIG9uU3RvcCQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAvL1xyXG4gIC8vIFR3byBtZXRob2RzIGF2YWlsYWJsZSBmb3IgY2FsbGluZyBpbnRvIHRoZSBsaWJyYXJ5OlxyXG4gIC8vXHJcbiAgLy8gMSkgVXNpbmcgZGlzcGF0Y2hFdmVudCgpIHdpdGggdGhlIGZvbGxvd2luZyBjdXN0b20gZXZlbnRzXHJcbiAgLy8gMikgVXNpbmcgdGhlIHdpbmRvdyBzY29wZWQgUmV2ZWxEaWdpdGFsIG9iamVjdCBhcyBkZWZpbmVkIGluIHRoZSBjb25zdHJ1Y3RvclxyXG4gIC8vXHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIG9uU3RhcnRTdWI6IFN1YnNjcmlwdGlvbjtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgb25TdGFydEV2dCQgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdSZXZlbERpZ2l0YWwuU3RhcnQnKS5waXBlKFxyXG4gICAgc2hhcmUoKSxcclxuICAgIHRhcCh0aGlzLm9uU3RhcnQkKVxyXG4gICk7XHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIG9uU3RvcFN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBvblN0b3BFdnQkID0gZnJvbUV2ZW50KGRvY3VtZW50LCAnUmV2ZWxEaWdpdGFsLlN0b3AnKS5waXBlKFxyXG4gICAgc2hhcmUoKSxcclxuICAgIHRhcCh0aGlzLm9uU3RvcCQpXHJcbiAgKTtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgb25Db21tYW5kU3ViOiBTdWJzY3JpcHRpb247XHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIG9uQ29tbWFuZEV2dCQgPSBmcm9tRXZlbnQ8SUNvbW1hbmQ+KGRvY3VtZW50LCAnUmV2ZWxEaWdpdGFsLkNvbW1hbmQnKS5waXBlKFxyXG4gICAgbWFwKChlOiBhbnkpID0+IHsgcmV0dXJuIHsgbmFtZTogZS5kZXRhaWwubmFtZSwgYXJnOiBlLmRldGFpbC5hcmcgfSBhcyBJQ29tbWFuZCB9KSxcclxuICAgIHNoYXJlKCksXHJcbiAgICB0YXAodGhpcy5vbkNvbW1hbmQkKVxyXG4gICk7XHJcblxyXG4gIC8vIHByaXZhdGUgb25Qb3N0TWVzc2FnZVN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIC8vIHByaXZhdGUgb25Qb3N0TWVzc2FnZUV2dCQgPSBmcm9tRXZlbnQod2luZG93LCAnbWVzc2FnZScpLnBpcGUoXHJcbiAgLy8gICBmaWx0ZXIoKG1lc3NhZ2VFdmVudDogTWVzc2FnZUV2ZW50KSA9PlxyXG4gIC8vICAgICBtZXNzYWdlRXZlbnQuc291cmNlICE9PSB3aW5kb3cucGFyZW50ICYmXHJcbiAgLy8gICAgIHR5cGVvZiBtZXNzYWdlRXZlbnQuZGF0YSA9PT0gJ3N0cmluZycgJiZcclxuICAvLyAgICAgbWVzc2FnZUV2ZW50LmRhdGEuc3RhcnRzV2l0aCgncmV2ZWxkaWdpdGFsOicpKSxcclxuICAvLyAgIG1hcCgoZTogYW55KSA9PiB7IHJldHVybiBKU09OLnBhcnNlKGUuc3Vic3RyaW5nKDEzKSkgYXMgQ29tbWFuZCB9KSxcclxuICAvLyAgIHNoYXJlKCksXHJcbiAgLy8gICB0YXAodGhpcy5vbkNvbW1hbmQkKVxyXG4gIC8vICk7XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgY29uc3RydWN0b3Ioem9uZTogTmdab25lKSB7XHJcblxyXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLlJldmVsRGlnaXRhbCA9IHtcclxuICAgICAgQ29udHJvbGxlcjoge1xyXG4gICAgICAgIG9uQ29tbWFuZDogZnVuY3Rpb24gKG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpIHtcclxuICAgICAgICAgIHpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgc2VsZi5vbkNvbW1hbmQkLm5leHQoeyBuYW1lOiBuYW1lLCBhcmc6IGFyZyB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25TdGFydDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBzZWxmLm9uU3RhcnQkLm5leHQobnVsbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uU3RvcDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBzZWxmLm9uU3RvcCQubmV4dChudWxsKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub25TdGFydFN1YiA9IHRoaXMub25TdGFydEV2dCQuc3Vic2NyaWJlKCgpID0+IHsgfSk7XHJcbiAgICB0aGlzLm9uU3RvcFN1YiA9IHRoaXMub25TdG9wRXZ0JC5zdWJzY3JpYmUoKCkgPT4geyB9KTtcclxuICAgIHRoaXMub25Db21tYW5kU3ViID0gdGhpcy5vbkNvbW1hbmRFdnQkLnN1YnNjcmliZSgoKSA9PiB7IH0pO1xyXG5cclxuICAgIHRoaXMuY2xpZW50UHJvbWlzZSA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5vblJlYWR5JC5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLm9uU3RhcnRTdWI/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLm9uU3RvcFN1Yj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMub25Db21tYW5kU3ViPy51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMub25SZWFkeSQubmV4dChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgaW5pdChkYXRhOiBhbnkpIHtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgJyVj4pqZ77iPIEluaXRpYWxpemluZyBSZXZlbCBEaWdpdGFsIGNsaWVudCBsaWJyYXJ5JyxcclxuICAgICAgJ2JhY2tncm91bmQtY29sb3I6Ymx1ZTsgY29sb3I6eWVsbG93OydcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIGdhZGdldCB0byBjb21tdW5pY2F0ZSB3aXRoIHBsYXllciBzY3JpcHRpbmcuXHJcbiAgICogSWYgdGhlIGFwcHJvcHJpYXRlIHNjcmlwdGluZyBpcyBpbiBwbGFjZSBpbiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVtcGxhdGUsIGNhbGxpbmcgdGhpcyBtZXRob2RcclxuICAgKiB3aWxsIGluaXRpYXRlIGEgY2FsbGJhY2sgd2hpY2ggY2FuIGJlIGFjdGVkIHVwb24gaW4gcGxheWVyIHNjcmlwdC5cclxuICAgKiBcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGNsaWVudC5jYWxsYmFjaygndGVzdCcsICd0aGlzJyk7XHJcbiAgICogXHJcbiAgICogQHBhcmFtIGFyZ3MgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50c1xyXG4gICAqL1xyXG4gIHB1YmxpYyBjYWxsYmFjayguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcblxyXG4gICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgY2xpZW50LmNhbGxiYWNrKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1swXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1sxXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1syXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1szXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1s0XSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFjY2Vzc29yIG1ldGhvZCBmb3IgdGhlIHVzZXIgcHJlZmVyZW5jZXMgaW50ZXJmYWNlIGV4cG9zZWQgYnkgdGhlIEdhZGdldHMgQVBJLlxyXG4gICAqIFxyXG4gICAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vZ2FkZ2V0cy9kb2NzL2Jhc2ljfSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBHYWRnZXRzIEFQSS5cclxuICAgKiBcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGllbnQ6IFBsYXllckNsaWVudFNlcnZpY2UpIHtcclxuICAgKiAgICAgICAgICAgIGxldCBwcmVmcyA9IGNsaWVudC5nZXRQcmVmcygpO1xyXG4gICAqICAgICAgICAgICAgbGV0IG15U3RyaW5nID0gcHJlZnMuZ2V0U3RyaW5nKCdteVN0cmluZ1ByZWYnKTtcclxuICAgKiB9XHJcbiAgICogQHJldHVybnMge2dhZGdldHMuUHJlZnN9IEdhZGdldCBBUEkgUHJlZnMgb2JqZWN0XHJcbiAgICovXHJcbiAgcHVibGljIGdldFByZWZzKCk6IGdhZGdldHMuUHJlZnMge1xyXG5cclxuICAgIHJldHVybiBuZXcgd2luZG93WydnYWRnZXRzJ11bJ1ByZWZzJ10oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZGV2aWNlIHRpbWUgaW4gSVNPODYwMSBmb3JtYXQuXHJcbiAgICogQ3VycmVudCBkZXZpY2UgdGltZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBkZXZpY2UgdGltZXpvbmUgYXNzaWduZWQgdG8gdGhlIGRldmljZSBpbiB0aGUgQ01TLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBkYXRlIE9wdGlvbmFsLiBJZiBzdXBwbGllZCB3aWxsIHRyYW5zbGF0ZSB0aGUgc3VwcGxpZWQgZGF0ZS90aW1lIHRvIGRldmljZSB0aW1lIGJhc2VkIG9uIHJlc3BlY3RpdmUgdGltZXpvbmVzLlxyXG4gICAqIEByZXR1cm5zIERhdGUvdGltZSBpbiBJU084NjAxIGZvcm1hdFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lKGRhdGU/OiBEYXRlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIGlmIChkYXRlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lKGRhdGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSB0aW1lem9uZSBuYW1lIGN1cnJlbnRseSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFRpbWV6b25lIE5hbWVcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gY2xpZW50LmdldERldmljZVRpbWVab25lTmFtZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdGltZXpvbmUgSUQgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBkZXZpY2UuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgVGltZXpvbmUgSURcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVJRCgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lWm9uZUlEKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBudW1lcmljYWwgb2Zmc2V0IGZyb20gR01UIG9mIHRoZSB0aW1lem9uZSBjdXJyZW50bHkgYXNzaWduZWQgdG8gdGhlIGRldmljZS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBUaW1lem9uZSBvZmZzZXRcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTogUHJvbWlzZTxudW1iZXI+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGxhbmd1YWdlIGNvZGUgb2YgdGhlIGxhbmd1YWdlIGN1cnJlbnRseSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIExhbmd1YWdlIGNvZGVcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0TGFuZ3VhZ2VDb2RlKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gY2xpZW50LmdldExhbmd1YWdlQ29kZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdW5pcXVlIFJldmVsIERpZ2l0YWwgZGV2aWNlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBEZXZpY2Uga2V5XHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZUtleSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VLZXkoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBwbGF5ZXIgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBuYW1lIENvbW1hbmQgbmFtZVxyXG4gICAqIEBwYXJhbSBhcmcgQ29tbWFuZCBhcmd1bWVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZW5kQ29tbWFuZChuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcclxuICAgICAgY2xpZW50LnNlbmRDb21tYW5kKG5hbWUsIGFyZyk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBhIGNvbW1hbmQgdG8gYW55IHJlbW90ZSBwbGF5ZXIgd2l0aCB0aGUgc3VwcGxpZWQgZGV2aWNlIGtleShzKS5cclxuICAgKiBOb3RlOiBSZW1vdGUgY29tbWFuZHMgY2FuIG9ubHkgYmUgZGVsaXZlcmVkIHRvIGRldmljZXMgd2l0aGluIHRoZSBzYW1lIGFjY291bnQgYXMgdGhlIHNlbmRlciBkZXZpY2UuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGRldmljZUtleXMgQXJyYXkgb2YgcmVtb3RlIGRldmljZSBrZXlzXHJcbiAgICogQHBhcmFtIG5hbWUgQ29tbWFuZCBuYW1lXHJcbiAgICogQHBhcmFtIGFyZyBDb21tYW5kIGFyZ1xyXG4gICAqL1xyXG4gIHB1YmxpYyBzZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcbiAgICAgIGNsaWVudC5zZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzLCBuYW1lLCBhcmcpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2cgYW4gZXZlbnQgZm9yIHVzZSB3aXRoIEFkSGF3ayBhbmFseXRpY3MuXHJcbiAgICogRXZlbnRzIGFyZSB1c2VkIGZvciB0cmFja2luZyB2YXJpb3VzIG1ldHJpY3MgaW5jbHVkaW5nIHVzYWdlIHN0YXRpc3RpY3MsIHBsYXllciBjb25kaXRpb24sIHN0YXRlIGNoYW5nZXMsIGV0Yy5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gZXZlbnROYW1lIFVuaXF1ZSBuYW1lIGZvciB0aGlzIGV2ZW50XHJcbiAgICogQHBhcmFtIHByb3BlcnRpZXMgQSBtYXAgb2YgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBldmVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyB0cmFjayhldmVudE5hbWU6IHN0cmluZywgcHJvcGVydGllcz86IElFdmVudFByb3BlcnRpZXMpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xyXG4gICAgICBjbGllbnQudHJhY2soZXZlbnROYW1lLCBKU09OLnN0cmluZ2lmeShwcm9wZXJ0aWVzKSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0aG9kIGZvciBpbml0aWF0aW5nIGEgdGltZWQgZXZlbnQuXHJcbiAgICogVGltZWQgZXZlbnRzIGFyZSB1c2VmdWwgZm9yIHRyYWNraW5nIHRoZSBkdXJhdGlvbiBvZiBhbiBldmVudCBhbmQgbXVzdCBiZSBwcm9jZWVkZWQgd2l0aCBhIGNhbGwgdG8gdHJhY2soKS5cclxuICAgKiBcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGNsaWVudC50aW1lRXZlbnQoJ3Rlc3RFdmVudCcpO1xyXG4gICAqIGNsaWVudC50cmFjayhcInRlc3RcIiwgeyBcImFcIjogXCJiXCIgfSk7XHJcbiAgICogQHBhcmFtIGV2ZW50TmFtZSBVbmlxdWUgbmFtZSBmb3IgdGhpcyBldmVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyB0aW1lRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xyXG4gICAgICBjbGllbnQudGltZUV2ZW50KGV2ZW50TmFtZSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBzZXNzaW9uIGlzIGEgd2F5IG9mIGdyb3VwaW5nIGV2ZW50cyB0b2dldGhlci4gRWFjaCBldmVudCBoYXMgYW4gYXNzb2NpYXRlZCBzZXNzaW9uIElELlxyXG4gICAqIFNlc3Npb24gSUQncyBhcmUgcmFuZG9tbHkgZ2VuZXJhdGVkIGFuZCByZXNldCBieSBzdWJzZXF1ZW50IGNhbGxzIHRvIG5ld0V2ZW50U2Vzc2lvbigpLlxyXG4gICAqIFxyXG4gICAqIEVhY2ggY2FsbCB0byB0cmFjaygpIHdpbGwgdXRpbGl6ZSB0aGUgc2FtZSBzZXNzaW9uIElELCB1bnRpbCBhbm90aGVyIGNhbGwgdG8gbmV3RXZlbnRTZXNzaW9uKCkuXHJcbiAgICogQHBhcmFtIGlkIE9wdGlvbmFsLiBVc2VyIHN1cHBsaWVkIHNlc3Npb24gSUQuIElmIG5vdCBzdXBwbGllZCBhIHJhbmRvbSBzZXNzaW9uIElEIHdpbGwgYmUgZ2VuZXJhdGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBuZXdFdmVudFNlc3Npb24oaWQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xyXG4gICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNsaWVudC5uZXdFdmVudFNlc3Npb24oKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjbGllbnQubmV3RXZlbnRTZXNzaW9uKGlkKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHJvb3QgZm9sZGVyIHV0aWxpemVkIGJ5IHRoaXMgcGxheWVyIGRldmljZS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBQYXRoIHRvIHRoZSByb290IGZvbGRlclxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXRSZXZlbFJvb3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIHJldHVybiBjbGllbnQuZ2V0UmV2ZWxSb290KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgbWFwIG9mIGNvbW1hbmRzIGN1cnJlbnRseSBhY3RpdmUgZm9yIHRoaXMgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIE1hcCBvZiBjb21tYW5kcyBjdXJyZW50bHkgYWN0aXZlIGZvciB0aGlzIGRldmljZS5cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0Q29tbWFuZE1hcCgpOiBQcm9taXNlPGFueT4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgY2xpZW50LmdldENvbW1hbmRNYXAoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbmRpY2F0ZSB0byB0aGUgcGxheWVyIHRoYXQgdGhpcyBnYWRnZXQgaGFzIGZpbmlzaGVkIGl0J3MgdmlzdWFsaXphdGlvbi5cclxuICAgKiBUaGlzIGFsbG93cyB0aGUgcGxheWVyIHRvIHByb2NlZWQgd2l0aCB0aGUgbmV4dCBpdGVtIGluIGEgcGxheWxpc3QgaWYgYXBwbGljYWJsZS5cclxuICAgKi9cclxuICBwdWJsaWMgZmluaXNoKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcblxyXG4gICAgICBjbGllbnQuZmluaXNoKCk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaXMgdGhlIGdhZGdldCBpcyBydW5uaW5nIGluIHByZXZpZXcgbW9kZS4gUHJldmlldyBtb2RlIGlzIGVuYWJsZWQgd2hlbiB0aGUgZ2FkZ2V0IGlzXHJcbiAgICogYmVpbmcgZWRpdGVkIGluIHRoZSBDTVMsIG9yIG90aGVyd2lzZSBub3QgcnVubmluZyBpbiBhIG5vcm1hbCBwbGF5ZXIgZW52aXJvbm1lbnQuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZ2FkZ2V0IGlzIHJ1bm5pbmcgaW4gcHJldmlldyBtb2RlLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGlzUHJldmlld01vZGUoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gY2xpZW50IGluc3RhbmNlb2YgTm9vcENsaWVudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkZXZpY2UgZGV0YWlscyBhc3NvY2lhdGVkIHdpdGggdGhlIHBsYXllciBydW5uaW5nIHRoZSBnYWRnZXQgb3Igd2ViIGFwcC5cclxuICogXHJcbiAqIEByZXR1cm5zIERldmljZSBkZXRhaWxzLlxyXG4gKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlKCk6IFByb21pc2U8SURldmljZSB8IG51bGw+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIGxldCBvYmo6IGFueSA9IEpTT04ucGFyc2UoPHN0cmluZz5hd2FpdCBjbGllbnQuZ2V0RGV2aWNlKCkpO1xyXG5cclxuICAgIGNvbnN0IGRldmljZTogSURldmljZVtdID0gW29ial0ubWFwKChkZXZpY2U6IGFueSkgPT4ge1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBuYW1lOiBkZXZpY2UubmFtZSxcclxuICAgICAgICByZWdpc3RyYXRpb25LZXk6IGRldmljZS5rZXksXHJcbiAgICAgICAgZGV2aWNlVHlwZTogZGV2aWNlLmRldmljZXR5cGUsXHJcbiAgICAgICAgZW50ZXJlZFNlcnZpY2U6IG5ldyBEYXRlKGRldmljZS5lbnRlcmVkc2VydmljZSksXHJcbiAgICAgICAgbGFuZ0NvZGU6IGRldmljZS5sYW5nY29kZSxcclxuICAgICAgICB0aW1lWm9uZTogZGV2aWNlLnRpbWV6b25lLFxyXG4gICAgICAgIHRhZ3M6IGRldmljZS5kZXNjcmlwdGlvbj8uc3BsaXQoJ1xcbicpLFxyXG4gICAgICAgIGxvY2F0aW9uOiB7XHJcbiAgICAgICAgICBjaXR5OiBkZXZpY2UubG9jYXRpb24/LmNpdHksXHJcbiAgICAgICAgICBzdGF0ZTogZGV2aWNlLmxvY2F0aW9uPy5zdGF0ZSxcclxuICAgICAgICAgIGNvdW50cnk6IGRldmljZS5sb2NhdGlvbj8uY291bnRyeSxcclxuICAgICAgICAgIHBvc3RhbENvZGU6IGRldmljZS5sb2NhdGlvbj8ucG9zdGFsY29kZSxcclxuICAgICAgICAgIGFkZHJlc3M6IGRldmljZS5sb2NhdGlvbj8uYWRkcmVzcyxcclxuICAgICAgICAgIGxhdGl0dWRlOiBkZXZpY2UubG9jYXRpb24/LmxhdGl0dWRlLFxyXG4gICAgICAgICAgbG9uZ2l0dWRlOiBkZXZpY2UubG9jYXRpb24/LmxvbmdpdHVkZVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGV2aWNlWzBdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgd2lkdGggb2YgdGhlIHZpc3VhbGl6YXRpb24gYXJlYS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBXaWR0aCBvZiB0aGUgdmlzdWFsaXphdGlvbiBhcmVhXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdldFdpZHRoKCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXRXaWR0aCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSB2aXN1YWxpemF0aW9uIGFyZWEuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgSGVpZ2h0IG9mIHRoZSB2aXN1YWxpemF0aW9uIGFyZWFcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0SGVpZ2h0KCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXRIZWlnaHQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50bHkgcGxheWluZyBzb3VyY2UuXHJcbiAgICogKG9ubHkgYXBwbGljYWJsZSB3aGVuIGFzc29jaWF0ZWQgd2l0aCBhIHBsYXlsaXN0KVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIER1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGl0ZW0gaW4gbWlsbGlzZWNvbmRzXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdldER1cmF0aW9uKCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXREdXJhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBTREsgdmVyc2lvbi5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBTREsgdmVyc2lvblxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXRTZGtWZXJzaW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2ZXJzaW9uKTtcclxuICB9XHJcblxyXG5cclxuICAvLyAtLS1cclxuICAvLyBQUklWQVRFIE1FVEhPRFMuXHJcbiAgLy8gLS0tXHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIGdldENsaWVudCgpOiBQcm9taXNlPElDbGllbnQ+IHtcclxuXHJcbiAgICBpZiAodGhpcy5jbGllbnRQcm9taXNlKSB7XHJcblxyXG4gICAgICByZXR1cm4gKHRoaXMuY2xpZW50UHJvbWlzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvdy5DbGllbnQpIHtcclxuXHJcbiAgICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5DbGllbnQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBIFwiY29tcGxldGVcIiBzdGF0dXMgaW5kaWNhdGVzIHRoYXQgdGhlIFwibG9hZFwiIGV2ZW50IGhhcyBiZWVuIGZpcmVkIG9uIHRoZVxyXG4gICAgLy8gd2luZG93OyBhbmQsIHRoYXQgYWxsIHN1Yi1yZXNvdXJjZXMgc3VjaCBhcyBTY3JpcHRzLCBJbWFnZXMsIGFuZCBGcmFtZXMgaGF2ZVxyXG4gICAgLy8gYmVlbiBsb2FkZWQuXHJcbiAgICBpZiAod2luZG93LmRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIikge1xyXG5cclxuICAgICAgLy8gSWYgdGhpcyBldmVudCBoYXMgZmlyZWQgQU5EIHRoZSAzcmQtcGFydHkgc2NyaXB0IGlzbid0IGF2YWlsYWJsZSAoc2VlIElGLVxyXG4gICAgICAvLyBjb25kaXRpb24gQkVGT1JFIHRoaXMgb25lKSwgaXQgbWVhbnMgdGhhdCB0aGUgM3JkLXBhcnR5IHNjcmlwdCBlaXRoZXJcclxuICAgICAgLy8gZmFpbGVkIG9uIHRoZSBuZXR3b3JrIG9yIHdhcyBCTE9DS0VEIGJ5IGFuIGFkLWJsb2NrZXIuIEFzIHN1Y2gsIHdlIGhhdmUgdG9cclxuICAgICAgLy8gZmFsbC1iYWNrIHRvIHVzaW5nIGEgbW9jayBBUEkuXHJcbiAgICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKG5ldyBOb29wQ2xpZW50KCkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBU1NFUlQ6IElmIHdlIG1hZGUgaXQgdGhpcyBmYXIsIHRoZSBkb2N1bWVudCBoYXMgbm90IGNvbXBsZXRlZCBsb2FkaW5nIChidXQgaXRcclxuICAgIC8vIG1heSBiZSBpbiBhbiBcImludGVyYWN0aXZlXCIgc3RhdGUgd2hpY2ggaXMgd2hlbiBJIGJlbGlldmUgdGhhdCB0aGUgQW5ndWxhciBhcHBcclxuICAgIC8vIGdldHMgYm9vdHN0cmFwcGVkKS4gQXMgc3VjaCwgd2UgbmVlZCBiaW5kIHRvIHRoZSBMT0FEIGV2ZW50IHRvIHdhaXQgZm9yIG91clxyXG4gICAgLy8gdGhpcmQtcGFydHkgc2NyaXB0cyB0byBsb2FkIChvciBmYWlsIHRvIGxvYWQsIG9yIGJlIGJsb2NrZWQpLlxyXG4gICAgdGhpcy5jbGllbnRQcm9taXNlID0gbmV3IFByb21pc2U8SUNsaWVudD4oXHJcbiAgICAgIChyZXNvbHZlKSA9PiB7XHJcblxyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICAgXCJsb2FkXCIsXHJcbiAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVXaW5kb3dMb2FkKCkge1xyXG5cclxuICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIDNyZC1wYXJ0eSBsaWJyYXJ5IGlzIGVpdGhlciBhdmFpbGFibGUgb3JcclxuICAgICAgICAgICAgLy8gaXQncyBub3QgLSB0aGVyZSdzIG5vIGZ1cnRoZXIgbG9hZGluZyB0byBkby4gSWYgaXQncyBub3RcclxuICAgICAgICAgICAgLy8gcHJlc2VudCBvbiB0aGUgZ2xvYmFsIHNjb3BlLCB3ZSdyZSBnb2luZyB0byBmYWxsLWJhY2sgdG8gdXNpbmdcclxuICAgICAgICAgICAgLy8gYSBtb2NrIEFQSS5cclxuICAgICAgICAgICAgcmVzb2x2ZSh3aW5kb3cuQ2xpZW50IHx8IG5ldyBOb29wQ2xpZW50KCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlKTtcclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cclxuXHJcbi8vIEkgcHJvdmlkZSBhIG1vY2sgQVBJIGZvciB0aGUgM3JkLXBhcnR5IHNjcmlwdC4gVGhpcyBqdXN0IGFsbG93cyB0aGUgY29uc3VtaW5nIGNvZGUgdG9cclxuLy8gYWN0IGFzIHRob3VnaCB0aGUgbGlicmFyeSBpcyBhdmFpbGFibGUgZXZlbiBpZiBpdCBmYWlsZWQgdG8gbG9hZCAoZXhhbXBsZSwgaXQgd2FzXHJcbi8vIGJsb2NrZWQgYnkgYW4gYWQtYmxvY2tlcikuXHJcblxyXG4vKiogQGlnbm9yZSAqL1xyXG5jbGFzcyBOb29wQ2xpZW50IGltcGxlbWVudHMgSUNsaWVudCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAnJWNDbGllbnQgQVBJIG5vdCBhdmFpbGFibGUsIGZhbGxpbmcgYmFjayB0byBtb2NrIEFQSScsXHJcbiAgICAgICdiYWNrZ3JvdW5kLWNvbG9yOmJsdWU7IGNvbG9yOnllbGxvdzsnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbGxiYWNrKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XHJcblxyXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGV2aWNlVGltZShkYXRlPzogRGF0ZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWVab25lTmFtZSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVJRCgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTogUHJvbWlzZTxudW1iZXI+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldExhbmd1YWdlQ29kZSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlS2V5KCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZW5kQ29tbWFuZChuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VuZFJlbW90ZUNvbW1hbmQoZGV2aWNlS2V5czogc3RyaW5nW10sIG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpIHtcclxuXHJcbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0cmFjayhldmVudE5hbWU6IHN0cmluZywgcHJvcGVydGllcz86IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxyXG4gIH1cclxuXHJcbiAgcHVibGljIHRpbWVFdmVudChldmVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5ld0V2ZW50U2Vzc2lvbihpZD86IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFJldmVsUm9vdCgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0Q29tbWFuZE1hcCgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoJ3t9Jyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmluaXNoKCk6IHZvaWQge1xyXG5cclxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZSgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFdpZHRoKCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0SGVpZ2h0KCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RHVyYXRpb24oKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRTZGtWZXJzaW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2ZXJzaW9uKTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,3 @@
1
+ // Generated by genversion.
2
+ export const version = '1.0.10';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JldmVsZGlnaXRhbC9wbGF5ZXItY2xpZW50L3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQkFBMkI7QUFDM0IsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBieSBnZW52ZXJzaW9uLlxuZXhwb3J0IGNvbnN0IHZlcnNpb24gPSAnMS4wLjEwJ1xuIl19
@@ -12,6 +12,9 @@ import { RouterModule } from '@angular/router';
12
12
  import { APP_BASE_HREF } from '@angular/common';
13
13
  import * as i1$1 from '@angular/platform-browser';
14
14
 
15
+ // Generated by genversion.
16
+ const version = '1.0.10';
17
+
15
18
  class PlayerClientService {
16
19
  // private onPostMessageSub: Subscription;
17
20
  // private onPostMessageEvt$ = fromEvent(window, 'message').pipe(
@@ -348,6 +351,50 @@ class PlayerClientService {
348
351
  return device[0];
349
352
  });
350
353
  }
354
+ /**
355
+ * Returns the width of the visualization area.
356
+ *
357
+ * @returns Width of the visualization area
358
+ */
359
+ getWidth() {
360
+ return __awaiter(this, void 0, void 0, function* () {
361
+ const client = yield this.getClient();
362
+ return client.getWidth();
363
+ });
364
+ }
365
+ /**
366
+ * Returns the height of the visualization area.
367
+ *
368
+ * @returns Height of the visualization area
369
+ */
370
+ getHeight() {
371
+ return __awaiter(this, void 0, void 0, function* () {
372
+ const client = yield this.getClient();
373
+ return client.getHeight();
374
+ });
375
+ }
376
+ /**
377
+ * Returns the duration of the currently playing source.
378
+ * (only applicable when associated with a playlist)
379
+ *
380
+ * @returns Duration of the current item in milliseconds
381
+ */
382
+ getDuration() {
383
+ return __awaiter(this, void 0, void 0, function* () {
384
+ const client = yield this.getClient();
385
+ return client.getDuration();
386
+ });
387
+ }
388
+ /**
389
+ * Returns the current SDK version.
390
+ *
391
+ * @returns SDK version
392
+ */
393
+ getSdkVersion() {
394
+ return __awaiter(this, void 0, void 0, function* () {
395
+ return Promise.resolve(version);
396
+ });
397
+ }
351
398
  // ---
352
399
  // PRIVATE METHODS.
353
400
  // ---
@@ -459,13 +506,33 @@ class NoopClient {
459
506
  return Promise.resolve('{}');
460
507
  });
461
508
  }
509
+ finish() {
510
+ // NOOP implement, nothing to do....
511
+ }
462
512
  getDevice() {
463
513
  return __awaiter(this, void 0, void 0, function* () {
464
514
  return Promise.resolve(null);
465
515
  });
466
516
  }
467
- finish() {
468
- // NOOP implement, nothing to do....
517
+ getWidth() {
518
+ return __awaiter(this, void 0, void 0, function* () {
519
+ return Promise.resolve(null);
520
+ });
521
+ }
522
+ getHeight() {
523
+ return __awaiter(this, void 0, void 0, function* () {
524
+ return Promise.resolve(null);
525
+ });
526
+ }
527
+ getDuration() {
528
+ return __awaiter(this, void 0, void 0, function* () {
529
+ return Promise.resolve(null);
530
+ });
531
+ }
532
+ getSdkVersion() {
533
+ return __awaiter(this, void 0, void 0, function* () {
534
+ return Promise.resolve(version);
535
+ });
469
536
  }
470
537
  }
471
538
 
@@ -1 +1 @@
1
- {"version":3,"file":"reveldigital-player-client.mjs","sources":["../../../../projects/reveldigital/player-client/src/lib/player-client.service.ts","../../../../projects/reveldigital/player-client/src/lib/app-init.service.ts","../../../../projects/reveldigital/player-client/src/lib/safe-style.pipe.ts","../../../../projects/reveldigital/player-client/src/lib/player-client.module.ts","../../../../projects/reveldigital/player-client/src/public-api.ts","../../../../projects/reveldigital/player-client/src/reveldigital-player-client.ts"],"sourcesContent":["import { Injectable, NgZone, OnDestroy } from '@angular/core';\r\nimport { gadgets } from '@reveldigital/gadget-types';\r\nimport { BehaviorSubject, fromEvent, Subject, Subscription } from 'rxjs';\r\nimport { map, share, tap } from 'rxjs/operators';\r\nimport { ICommand } from './interfaces/command.interface';\r\nimport { IDevice } from './interfaces/device.interface';\r\nimport { IEventProperties } from './interfaces/event-properties.interface';\r\nimport { IClient } from './interfaces/client.interface';\r\n\r\n\r\n// So that TypeScript doesn't complain, we're going to augment the GLOBAL / WINDOW \r\n// name-space definition to include the Tracker API. This also provides us with a place\r\n// to actually DOCUMENT the API so that our developers aren't guessing about what's\r\n// available on the library.\r\n\r\n/** @ignore */\r\ndeclare global {\r\n var Client: IClient;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PlayerClientService implements OnDestroy {\r\n\r\n /** @ignore */\r\n private clientPromise: Promise<IClient> | null;\r\n\r\n /**\r\n * Commands sent to this player.\r\n */\r\n public onCommand$ = new Subject<ICommand>();\r\n /**\r\n * Signals the gadget has been loaded and is ready to start.\r\n */\r\n public onReady$ = new BehaviorSubject(false);\r\n /**\r\n * Signals the gadget has been started by the player.\r\n */\r\n public onStart$ = new Subject();\r\n /**\r\n * Signals the gadgets has been stopped by the player.\r\n */\r\n public onStop$ = new Subject();\r\n\r\n //\r\n // Two methods available for calling into the library:\r\n //\r\n // 1) Using dispatchEvent() with the following custom events\r\n // 2) Using the window scoped RevelDigital object as defined in the constructor\r\n //\r\n /** @ignore */\r\n private onStartSub: Subscription;\r\n /** @ignore */\r\n private onStartEvt$ = fromEvent(document, 'RevelDigital.Start').pipe(\r\n share(),\r\n tap(this.onStart$)\r\n );\r\n /** @ignore */\r\n private onStopSub: Subscription;\r\n /** @ignore */\r\n private onStopEvt$ = fromEvent(document, 'RevelDigital.Stop').pipe(\r\n share(),\r\n tap(this.onStop$)\r\n );\r\n /** @ignore */\r\n private onCommandSub: Subscription;\r\n /** @ignore */\r\n private onCommandEvt$ = fromEvent<ICommand>(document, 'RevelDigital.Command').pipe(\r\n map((e: any) => { return { name: e.detail.name, arg: e.detail.arg } as ICommand }),\r\n share(),\r\n tap(this.onCommand$)\r\n );\r\n\r\n // private onPostMessageSub: Subscription;\r\n // private onPostMessageEvt$ = fromEvent(window, 'message').pipe(\r\n // filter((messageEvent: MessageEvent) =>\r\n // messageEvent.source !== window.parent &&\r\n // typeof messageEvent.data === 'string' &&\r\n // messageEvent.data.startsWith('reveldigital:')),\r\n // map((e: any) => { return JSON.parse(e.substring(13)) as Command }),\r\n // share(),\r\n // tap(this.onCommand$)\r\n // );\r\n\r\n /** @ignore */\r\n constructor(zone: NgZone) {\r\n\r\n let self = this;\r\n (window as any).RevelDigital = {\r\n Controller: {\r\n onCommand: function (name: string, arg: string) {\r\n zone.run(() => {\r\n self.onCommand$.next({ name: name, arg: arg });\r\n });\r\n },\r\n onStart: function () {\r\n zone.run(() => {\r\n self.onStart$.next(null);\r\n });\r\n },\r\n onStop: function () {\r\n zone.run(() => {\r\n self.onStop$.next(null);\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.onStartSub = this.onStartEvt$.subscribe(() => { });\r\n this.onStopSub = this.onStopEvt$.subscribe(() => { });\r\n this.onCommandSub = this.onCommandEvt$.subscribe(() => { });\r\n\r\n this.clientPromise = null;\r\n\r\n this.onReady$.next(true);\r\n }\r\n\r\n /** @ignore */\r\n ngOnDestroy(): void {\r\n\r\n this.onStartSub?.unsubscribe();\r\n this.onStopSub?.unsubscribe();\r\n this.onCommandSub?.unsubscribe();\r\n\r\n this.onReady$.next(false);\r\n }\r\n\r\n /** @ignore */\r\n public static init(data: any) {\r\n\r\n console.log(\r\n '%c⚙️ Initializing Revel Digital client library',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }\r\n\r\n /**\r\n * This method allows the gadget to communicate with player scripting.\r\n * If the appropriate scripting is in place in the currently running template, calling this method\r\n * will initiate a callback which can be acted upon in player script.\r\n * \r\n * @example\r\n * client.callback('test', 'this');\r\n * \r\n * @param args variable number of arguments\r\n */\r\n public callback(...args: any[]): void {\r\n\r\n this.getClient().then((client) => {\r\n\r\n switch (args.length) {\r\n case 0:\r\n client.callback();\r\n break;\r\n case 1:\r\n client.callback(args[0]);\r\n break;\r\n case 2:\r\n client.callback(args[1]);\r\n break;\r\n case 3:\r\n client.callback(args[2]);\r\n break;\r\n case 4:\r\n client.callback(args[3]);\r\n break;\r\n case 5:\r\n client.callback(args[4]);\r\n break;\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Accessor method for the user preferences interface exposed by the Gadgets API.\r\n * \r\n * See {@link https://developers.google.com/gadgets/docs/basic} for more details on the Gadgets API.\r\n * \r\n * @example\r\n * constructor(public client: PlayerClientService) {\r\n * let prefs = client.getPrefs();\r\n * let myString = prefs.getString('myStringPref');\r\n * }\r\n * @returns {gadgets.Prefs} Gadget API Prefs object\r\n */\r\n public getPrefs(): gadgets.Prefs {\r\n\r\n return new window['gadgets']['Prefs']();\r\n }\r\n\r\n /**\r\n * Returns the current device time in ISO8601 format.\r\n * Current device time is determined by the device timezone assigned to the device in the CMS.\r\n * \r\n * @param date Optional. If supplied will translate the supplied date/time to device time based on respective timezones.\r\n * @returns Date/time in ISO8601 format\r\n */\r\n public async getDeviceTime(date?: Date): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n if (date !== undefined) {\r\n return client.getDeviceTime(date);\r\n }\r\n return client.getDeviceTime();\r\n }\r\n\r\n /**\r\n * Returns the timezone name currently assigned to the device.\r\n * \r\n * @returns Timezone Name\r\n */\r\n public async getDeviceTimeZoneName(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneName();\r\n }\r\n\r\n /**\r\n * Returns the timezone ID currently assigned to the device.\r\n * \r\n * @returns Timezone ID\r\n */\r\n public async getDeviceTimeZoneID(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneID();\r\n }\r\n\r\n /**\r\n * Returns the numerical offset from GMT of the timezone currently assigned to the device.\r\n * \r\n * @returns Timezone offset\r\n */\r\n public async getDeviceTimeZoneOffset(): Promise<number> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneOffset();\r\n }\r\n\r\n /**\r\n * Returns the language code of the language currently assigned to the device.\r\n * \r\n * @returns Language code\r\n */\r\n public async getLanguageCode(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getLanguageCode();\r\n }\r\n\r\n /**\r\n * Returns the unique Revel Digital device key associated with the device.\r\n * \r\n * @returns Device key\r\n */\r\n public async getDeviceKey(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceKey();\r\n }\r\n\r\n /**\r\n * Send a command to the player device.\r\n * \r\n * @param name Command name\r\n * @param arg Command argument\r\n */\r\n public sendCommand(name: string, arg: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.sendCommand(name, arg);\r\n })\r\n }\r\n\r\n /**\r\n * Send a command to any remote player with the supplied device key(s).\r\n * Note: Remote commands can only be delivered to devices within the same account as the sender device.\r\n * \r\n * @param deviceKeys Array of remote device keys\r\n * @param name Command name\r\n * @param arg Command arg\r\n */\r\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.sendRemoteCommand(deviceKeys, name, arg);\r\n });\r\n }\r\n\r\n /**\r\n * Log an event for use with AdHawk analytics.\r\n * Events are used for tracking various metrics including usage statistics, player condition, state changes, etc.\r\n * \r\n * @param eventName Unique name for this event\r\n * @param properties A map of user defined properties to associate with this event\r\n */\r\n public track(eventName: string, properties?: IEventProperties): void {\r\n\r\n this.getClient().then((client) => {\r\n client.track(eventName, JSON.stringify(properties));\r\n })\r\n }\r\n\r\n /**\r\n * Method for initiating a timed event.\r\n * Timed events are useful for tracking the duration of an event and must be proceeded with a call to track().\r\n * \r\n * @example\r\n * client.timeEvent('testEvent');\r\n * client.track(\"test\", { \"a\": \"b\" });\r\n * @param eventName Unique name for this event\r\n */\r\n public timeEvent(eventName: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.timeEvent(eventName);\r\n })\r\n }\r\n\r\n /**\r\n * A session is a way of grouping events together. Each event has an associated session ID.\r\n * Session ID's are randomly generated and reset by subsequent calls to newEventSession().\r\n * \r\n * Each call to track() will utilize the same session ID, until another call to newEventSession().\r\n * @param id Optional. User supplied session ID. If not supplied a random session ID will be generated.\r\n */\r\n public newEventSession(id?: string): void {\r\n\r\n this.getClient().then((client) => {\r\n if (id !== undefined) {\r\n client.newEventSession();\r\n } else {\r\n client.newEventSession(id);\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Returns the root folder utilized by this player device.\r\n * \r\n * @returns Path to the root folder\r\n */\r\n public async getRevelRoot(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getRevelRoot();\r\n }\r\n\r\n /**\r\n * Returns a map of commands currently active for this device.\r\n * \r\n * @returns Map of commands currently active for this device.\r\n */\r\n public async getCommandMap(): Promise<any> {\r\n\r\n const client = await this.getClient();\r\n\r\n return JSON.parse(await client.getCommandMap());\r\n }\r\n\r\n /**\r\n * Indicate to the player that this gadget has finished it's visualization.\r\n * This allows the player to proceed with the next item in a playlist if applicable.\r\n */\r\n public finish(): void {\r\n\r\n this.getClient().then((client) => {\r\n\r\n client.finish();\r\n })\r\n }\r\n\r\n /**\r\n * Check is the gadget is running in preview mode. Preview mode is enabled when the gadget is\r\n * being edited in the CMS, or otherwise not running in a normal player environment.\r\n * \r\n * @returns True if the gadget is running in preview mode, false otherwise.\r\n */\r\n public async isPreviewMode(): Promise<boolean> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client instanceof NoopClient;\r\n }\r\n\r\n /**\r\n * Returns the device details associated with the player running the gadget or web app.\r\n * \r\n * @returns Device details.\r\n */\r\n public async getDevice(): Promise<IDevice | null> {\r\n\r\n const client = await this.getClient();\r\n\r\n let obj: any = JSON.parse(<string>await client.getDevice());\r\n\r\n const device: IDevice[] = [obj].map((device: any) => {\r\n\r\n return {\r\n name: device.name,\r\n registrationKey: device.key,\r\n deviceType: device.devicetype,\r\n enteredService: new Date(device.enteredservice),\r\n langCode: device.langcode,\r\n timeZone: device.timezone,\r\n tags: device.description?.split('\\n'),\r\n location: {\r\n city: device.location?.city,\r\n state: device.location?.state,\r\n country: device.location?.country,\r\n postalCode: device.location?.postalcode,\r\n address: device.location?.address,\r\n latitude: device.location?.latitude,\r\n longitude: device.location?.longitude\r\n }\r\n }\r\n });\r\n return device[0];\r\n }\r\n\r\n // ---\r\n // PRIVATE METHODS.\r\n // ---\r\n /** @ignore */\r\n private getClient(): Promise<IClient> {\r\n\r\n if (this.clientPromise) {\r\n\r\n return (this.clientPromise);\r\n }\r\n\r\n if (window.Client) {\r\n\r\n return (this.clientPromise = Promise.resolve(window.Client));\r\n }\r\n\r\n // A \"complete\" status indicates that the \"load\" event has been fired on the\r\n // window; and, that all sub-resources such as Scripts, Images, and Frames have\r\n // been loaded.\r\n if (window.document.readyState === \"complete\") {\r\n\r\n // If this event has fired AND the 3rd-party script isn't available (see IF-\r\n // condition BEFORE this one), it means that the 3rd-party script either\r\n // failed on the network or was BLOCKED by an ad-blocker. As such, we have to\r\n // fall-back to using a mock API.\r\n return (this.clientPromise = Promise.resolve(new NoopClient()));\r\n }\r\n\r\n // ASSERT: If we made it this far, the document has not completed loading (but it\r\n // may be in an \"interactive\" state which is when I believe that the Angular app\r\n // gets bootstrapped). As such, we need bind to the LOAD event to wait for our\r\n // third-party scripts to load (or fail to load, or be blocked).\r\n this.clientPromise = new Promise<IClient>(\r\n (resolve) => {\r\n\r\n window.addEventListener(\r\n \"load\",\r\n function handleWindowLoad() {\r\n\r\n // At this point, the 3rd-party library is either available or\r\n // it's not - there's no further loading to do. If it's not\r\n // present on the global scope, we're going to fall-back to using\r\n // a mock API.\r\n resolve(window.Client || new NoopClient());\r\n }\r\n );\r\n\r\n }\r\n );\r\n\r\n return (this.clientPromise);\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n// ----------------------------------------------------------------------------------- //\r\n// ----------------------------------------------------------------------------------- //\r\n\r\n// I provide a mock API for the 3rd-party script. This just allows the consuming code to\r\n// act as though the library is available even if it failed to load (example, it was\r\n// blocked by an ad-blocker).\r\n\r\n/** @ignore */\r\nclass NoopClient implements IClient {\r\n\r\n constructor() {\r\n\r\n console.log(\r\n '%cClient API not available, falling back to mock API',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }\r\n\r\n public callback(...args: any[]): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public getDeviceTime(date?: Date): Promise<string> {\r\n\r\n return Promise.resolve(new Date().toISOString());\r\n }\r\n\r\n public async getDeviceTimeZoneName(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceTimeZoneID(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceTimeZoneOffset(): Promise<number> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getLanguageCode(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceKey(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public sendCommand(name: string, arg: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string) {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public track(eventName: string, properties?: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public timeEvent(eventName: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public newEventSession(id?: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public async getRevelRoot(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getCommandMap(): Promise<string> {\r\n\r\n return Promise.resolve('{}');\r\n }\r\n\r\n public async getDevice(): Promise<string | null> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public finish(): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n}\r\n","import { Injectable, enableProdMode, isDevMode } from '@angular/core';\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport * as yaml from \"js-yaml\";\r\nimport * as WebFont from 'webfontloader';\r\n\r\nconst isLocal: boolean = /localhost/.test(document.location.host);\r\n!isLocal && enableProdMode();\r\n\r\n\r\n/** @ignore */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppInitService {\r\n\r\n constructor(\r\n public http: HttpClient,\r\n private _route: ActivatedRoute,\r\n private _router: Router) {\r\n }\r\n\r\n init(): Promise<any> {\r\n\r\n return new Promise<void>(async (resolve) => {\r\n\r\n this.loadFonts();\r\n\r\n if (isDevMode()) {\r\n console.log(\r\n '%cRunning in development mode',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n\r\n /**\r\n * Shim the shindig prefs functionality for dev mode\r\n */\r\n (<any>window).gadgets = {\r\n\r\n Prefs: class {\r\n getString(key: string) { return this.getParameterByName(key) }\r\n\r\n getArray(key: string) { return this.getParameterByName(key).split(',') }\r\n\r\n getBool(key: string) { return this.getParameterByName(key) === 'true' }\r\n\r\n getCountry() { }\r\n\r\n getFloat(key: string) { return parseFloat(this.getParameterByName(key)) }\r\n\r\n getInt(key: string) { return parseInt(this.getParameterByName(key)) }\r\n\r\n getLang() { return this.getParameterByName('lang') === '' ? 'en' : this.getParameterByName('lang'); }\r\n\r\n getParameterByName(name: string, search = window.location.href): string {\r\n\r\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\r\n let regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\r\n results = regex.exec(search);\r\n if (!results) return '';\r\n if (!results[2]) return '';\r\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\r\n }\r\n }\r\n };\r\n\r\n this.http.get('assets/gadget.yaml', {\r\n responseType: 'text'\r\n }).subscribe(data => {\r\n const doc: any = yaml.load(data);\r\n let params: any = {}\r\n for (const val of doc.prefs) {\r\n params[val.name] = val.default_value\r\n }\r\n\r\n this._router.navigate([], {\r\n relativeTo: this._route,\r\n queryParams: params,\r\n });\r\n\r\n console.log(\r\n `%cUser prefs loaded successfully`,\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }, (err) => {\r\n console.log(\r\n `%cUnable to load user preferences YAML definition file: ${err}`,\r\n 'background-color:blue; color:yellow;'\r\n );\r\n console.log(\r\n `%cPlease see our developer documentation for help with your app configuration: https://developer.reveldigital.com`,\r\n 'background-color:red; color:yellow;'\r\n )\r\n })\r\n }\r\n resolve();\r\n });\r\n }\r\n\r\n\r\n private getFamilyName(css) {\r\n\r\n let FONT_FAMILY_REGEX = /font-family:\\s*(?:[&#39;&#34;])*['\"]*(.+?)['\"]*(?:[&#39;&#34;])*\\s*;/i;\r\n if (FONT_FAMILY_REGEX.test(css)) {\r\n var matches = css.match(FONT_FAMILY_REGEX);\r\n return matches[1].split(',')[0];\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n /**\r\n * Loads the given font from Google Web Fonts.\r\n */\r\n private loadFonts(): void {\r\n\r\n const parameters = new URLSearchParams(window.location.search);\r\n parameters.forEach((val, key) => {\r\n try {\r\n let fontFamily = this.getFamilyName(val);\r\n if (fontFamily !== '') {\r\n WebFont.load({\r\n google: {\r\n families: [fontFamily]\r\n },\r\n fontactive: (familyName) => {\r\n console.log(`%cActivating font: ${familyName}`,\r\n 'background-color:blue; color:yellow;');\r\n },\r\n fontinactive: (familyName) => {\r\n console.log(`%cFont inactive: ${familyName}`,\r\n 'background-color:red; color:yellow;');\r\n }\r\n });\r\n }\r\n } catch (e) {\r\n }\r\n });\r\n }\r\n}\r\n","import { Pipe, PipeTransform, NgModule } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n/**\r\n * The safe style pipe is used when custom styles are defined for a gadget and must be applied to an Angular\r\n * component. This pipe will ensure the style can be appied safely by utilizing the DomSanitizer.\r\n * \r\n * @example\r\n * <h2 [style]=\"style | safeStyle\">Sample Pref: {{ prefs.getString('myStringPref') }}</h2>\r\n */\r\n@Pipe({\r\n name: 'safeStyle',\r\n})\r\nexport class SafeStylePipe implements PipeTransform {\r\n constructor(private sanitized: DomSanitizer) { }\r\n\r\n transform(value: any): unknown {\r\n return this.sanitized.bypassSecurityTrustStyle(value);\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [SafeStylePipe],\r\n exports: [SafeStylePipe],\r\n})\r\nexport class NgSafeStylePipeModule { }\r\n","import { APP_INITIALIZER, LOCALE_ID, NgModule } from '@angular/core';\nimport { PlayerClientService } from './player-client.service';\nimport { AppInitService } from './app-init.service';\nimport { HttpClientModule } from '@angular/common/http';\nimport { RouterModule } from '@angular/router';\nimport { APP_BASE_HREF } from '@angular/common';\nimport { NgSafeStylePipeModule } from './safe-style.pipe';\n\ndeclare var gadgets: any;\n\n\n@NgModule({\n imports: [\n HttpClientModule,\n RouterModule.forRoot([]),\n NgSafeStylePipeModule\n ],\n exports: [\n NgSafeStylePipeModule\n ],\n providers: [{\n provide: APP_INITIALIZER,\n useFactory: initializeApp,\n deps: [AppInitService, PlayerClientService],\n multi: true\n },\n {\n provide: LOCALE_ID,\n useFactory: () => {\n try {\n return new gadgets.Prefs().getLang();\n } catch {\n return 'en';\n }\n }\n },\n { provide: APP_BASE_HREF, useValue: '/gadgets/ifr' }]\n})\nexport class PlayerClientModule { }\n\nfunction initializeApp(appInitService: AppInitService) {\n return async () => {\n PlayerClientService.init({});\n await appInitService.init();\n }\n}\n","/*\n * Public API Surface of player-client\n */\n\nexport * from './lib/player-client.service';\nexport * from './lib/player-client.module';\nexport * from './lib/safe-style.pipe';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reveldigital-player-client.mjs","sources":["../../../../projects/reveldigital/player-client/src/lib/version.ts","../../../../projects/reveldigital/player-client/src/lib/player-client.service.ts","../../../../projects/reveldigital/player-client/src/lib/app-init.service.ts","../../../../projects/reveldigital/player-client/src/lib/safe-style.pipe.ts","../../../../projects/reveldigital/player-client/src/lib/player-client.module.ts","../../../../projects/reveldigital/player-client/src/public-api.ts","../../../../projects/reveldigital/player-client/src/reveldigital-player-client.ts"],"sourcesContent":["// Generated by genversion.\nexport const version = '1.0.10'\n","import { Injectable, NgZone, OnDestroy } from '@angular/core';\r\nimport { gadgets } from '@reveldigital/gadget-types';\r\nimport { BehaviorSubject, fromEvent, Subject, Subscription } from 'rxjs';\r\nimport { map, share, tap } from 'rxjs/operators';\r\nimport { ICommand } from './interfaces/command.interface';\r\nimport { IDevice } from './interfaces/device.interface';\r\nimport { IEventProperties } from './interfaces/event-properties.interface';\r\nimport { IClient } from './interfaces/client.interface';\r\nimport { version } from './version';\r\n\r\n//import { version } from './version.js';\r\n\r\n// So that TypeScript doesn't complain, we're going to augment the GLOBAL / WINDOW \r\n// name-space definition to include the Tracker API. This also provides us with a place\r\n// to actually DOCUMENT the API so that our developers aren't guessing about what's\r\n// available on the library.\r\n\r\n/** @ignore */\r\ndeclare global {\r\n var Client: IClient;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PlayerClientService implements OnDestroy {\r\n\r\n /** @ignore */\r\n private clientPromise: Promise<IClient> | null;\r\n\r\n /**\r\n * Commands sent to this player.\r\n */\r\n public onCommand$ = new Subject<ICommand>();\r\n /**\r\n * Signals the gadget has been loaded and is ready to start.\r\n */\r\n public onReady$ = new BehaviorSubject(false);\r\n /**\r\n * Signals the gadget has been started by the player.\r\n */\r\n public onStart$ = new Subject();\r\n /**\r\n * Signals the gadgets has been stopped by the player.\r\n */\r\n public onStop$ = new Subject();\r\n\r\n //\r\n // Two methods available for calling into the library:\r\n //\r\n // 1) Using dispatchEvent() with the following custom events\r\n // 2) Using the window scoped RevelDigital object as defined in the constructor\r\n //\r\n /** @ignore */\r\n private onStartSub: Subscription;\r\n /** @ignore */\r\n private onStartEvt$ = fromEvent(document, 'RevelDigital.Start').pipe(\r\n share(),\r\n tap(this.onStart$)\r\n );\r\n /** @ignore */\r\n private onStopSub: Subscription;\r\n /** @ignore */\r\n private onStopEvt$ = fromEvent(document, 'RevelDigital.Stop').pipe(\r\n share(),\r\n tap(this.onStop$)\r\n );\r\n /** @ignore */\r\n private onCommandSub: Subscription;\r\n /** @ignore */\r\n private onCommandEvt$ = fromEvent<ICommand>(document, 'RevelDigital.Command').pipe(\r\n map((e: any) => { return { name: e.detail.name, arg: e.detail.arg } as ICommand }),\r\n share(),\r\n tap(this.onCommand$)\r\n );\r\n\r\n // private onPostMessageSub: Subscription;\r\n // private onPostMessageEvt$ = fromEvent(window, 'message').pipe(\r\n // filter((messageEvent: MessageEvent) =>\r\n // messageEvent.source !== window.parent &&\r\n // typeof messageEvent.data === 'string' &&\r\n // messageEvent.data.startsWith('reveldigital:')),\r\n // map((e: any) => { return JSON.parse(e.substring(13)) as Command }),\r\n // share(),\r\n // tap(this.onCommand$)\r\n // );\r\n\r\n /** @ignore */\r\n constructor(zone: NgZone) {\r\n\r\n let self = this;\r\n (window as any).RevelDigital = {\r\n Controller: {\r\n onCommand: function (name: string, arg: string) {\r\n zone.run(() => {\r\n self.onCommand$.next({ name: name, arg: arg });\r\n });\r\n },\r\n onStart: function () {\r\n zone.run(() => {\r\n self.onStart$.next(null);\r\n });\r\n },\r\n onStop: function () {\r\n zone.run(() => {\r\n self.onStop$.next(null);\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.onStartSub = this.onStartEvt$.subscribe(() => { });\r\n this.onStopSub = this.onStopEvt$.subscribe(() => { });\r\n this.onCommandSub = this.onCommandEvt$.subscribe(() => { });\r\n\r\n this.clientPromise = null;\r\n\r\n this.onReady$.next(true);\r\n }\r\n\r\n /** @ignore */\r\n ngOnDestroy(): void {\r\n\r\n this.onStartSub?.unsubscribe();\r\n this.onStopSub?.unsubscribe();\r\n this.onCommandSub?.unsubscribe();\r\n\r\n this.onReady$.next(false);\r\n }\r\n\r\n /** @ignore */\r\n public static init(data: any) {\r\n\r\n console.log(\r\n '%c⚙️ Initializing Revel Digital client library',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }\r\n\r\n /**\r\n * This method allows the gadget to communicate with player scripting.\r\n * If the appropriate scripting is in place in the currently running template, calling this method\r\n * will initiate a callback which can be acted upon in player script.\r\n * \r\n * @example\r\n * client.callback('test', 'this');\r\n * \r\n * @param args variable number of arguments\r\n */\r\n public callback(...args: any[]): void {\r\n\r\n this.getClient().then((client) => {\r\n\r\n switch (args.length) {\r\n case 0:\r\n client.callback();\r\n break;\r\n case 1:\r\n client.callback(args[0]);\r\n break;\r\n case 2:\r\n client.callback(args[1]);\r\n break;\r\n case 3:\r\n client.callback(args[2]);\r\n break;\r\n case 4:\r\n client.callback(args[3]);\r\n break;\r\n case 5:\r\n client.callback(args[4]);\r\n break;\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Accessor method for the user preferences interface exposed by the Gadgets API.\r\n * \r\n * See {@link https://developers.google.com/gadgets/docs/basic} for more details on the Gadgets API.\r\n * \r\n * @example\r\n * constructor(public client: PlayerClientService) {\r\n * let prefs = client.getPrefs();\r\n * let myString = prefs.getString('myStringPref');\r\n * }\r\n * @returns {gadgets.Prefs} Gadget API Prefs object\r\n */\r\n public getPrefs(): gadgets.Prefs {\r\n\r\n return new window['gadgets']['Prefs']();\r\n }\r\n\r\n /**\r\n * Returns the current device time in ISO8601 format.\r\n * Current device time is determined by the device timezone assigned to the device in the CMS.\r\n * \r\n * @param date Optional. If supplied will translate the supplied date/time to device time based on respective timezones.\r\n * @returns Date/time in ISO8601 format\r\n */\r\n public async getDeviceTime(date?: Date): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n if (date !== undefined) {\r\n return client.getDeviceTime(date);\r\n }\r\n return client.getDeviceTime();\r\n }\r\n\r\n /**\r\n * Returns the timezone name currently assigned to the device.\r\n * \r\n * @returns Timezone Name\r\n */\r\n public async getDeviceTimeZoneName(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneName();\r\n }\r\n\r\n /**\r\n * Returns the timezone ID currently assigned to the device.\r\n * \r\n * @returns Timezone ID\r\n */\r\n public async getDeviceTimeZoneID(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneID();\r\n }\r\n\r\n /**\r\n * Returns the numerical offset from GMT of the timezone currently assigned to the device.\r\n * \r\n * @returns Timezone offset\r\n */\r\n public async getDeviceTimeZoneOffset(): Promise<number> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneOffset();\r\n }\r\n\r\n /**\r\n * Returns the language code of the language currently assigned to the device.\r\n * \r\n * @returns Language code\r\n */\r\n public async getLanguageCode(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getLanguageCode();\r\n }\r\n\r\n /**\r\n * Returns the unique Revel Digital device key associated with the device.\r\n * \r\n * @returns Device key\r\n */\r\n public async getDeviceKey(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceKey();\r\n }\r\n\r\n /**\r\n * Send a command to the player device.\r\n * \r\n * @param name Command name\r\n * @param arg Command argument\r\n */\r\n public sendCommand(name: string, arg: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.sendCommand(name, arg);\r\n })\r\n }\r\n\r\n /**\r\n * Send a command to any remote player with the supplied device key(s).\r\n * Note: Remote commands can only be delivered to devices within the same account as the sender device.\r\n * \r\n * @param deviceKeys Array of remote device keys\r\n * @param name Command name\r\n * @param arg Command arg\r\n */\r\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.sendRemoteCommand(deviceKeys, name, arg);\r\n });\r\n }\r\n\r\n /**\r\n * Log an event for use with AdHawk analytics.\r\n * Events are used for tracking various metrics including usage statistics, player condition, state changes, etc.\r\n * \r\n * @param eventName Unique name for this event\r\n * @param properties A map of user defined properties to associate with this event\r\n */\r\n public track(eventName: string, properties?: IEventProperties): void {\r\n\r\n this.getClient().then((client) => {\r\n client.track(eventName, JSON.stringify(properties));\r\n })\r\n }\r\n\r\n /**\r\n * Method for initiating a timed event.\r\n * Timed events are useful for tracking the duration of an event and must be proceeded with a call to track().\r\n * \r\n * @example\r\n * client.timeEvent('testEvent');\r\n * client.track(\"test\", { \"a\": \"b\" });\r\n * @param eventName Unique name for this event\r\n */\r\n public timeEvent(eventName: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.timeEvent(eventName);\r\n })\r\n }\r\n\r\n /**\r\n * A session is a way of grouping events together. Each event has an associated session ID.\r\n * Session ID's are randomly generated and reset by subsequent calls to newEventSession().\r\n * \r\n * Each call to track() will utilize the same session ID, until another call to newEventSession().\r\n * @param id Optional. User supplied session ID. If not supplied a random session ID will be generated.\r\n */\r\n public newEventSession(id?: string): void {\r\n\r\n this.getClient().then((client) => {\r\n if (id !== undefined) {\r\n client.newEventSession();\r\n } else {\r\n client.newEventSession(id);\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Returns the root folder utilized by this player device.\r\n * \r\n * @returns Path to the root folder\r\n */\r\n public async getRevelRoot(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getRevelRoot();\r\n }\r\n\r\n /**\r\n * Returns a map of commands currently active for this device.\r\n * \r\n * @returns Map of commands currently active for this device.\r\n */\r\n public async getCommandMap(): Promise<any> {\r\n\r\n const client = await this.getClient();\r\n\r\n return JSON.parse(await client.getCommandMap());\r\n }\r\n\r\n /**\r\n * Indicate to the player that this gadget has finished it's visualization.\r\n * This allows the player to proceed with the next item in a playlist if applicable.\r\n */\r\n public finish(): void {\r\n\r\n this.getClient().then((client) => {\r\n\r\n client.finish();\r\n })\r\n }\r\n\r\n /**\r\n * Check is the gadget is running in preview mode. Preview mode is enabled when the gadget is\r\n * being edited in the CMS, or otherwise not running in a normal player environment.\r\n * \r\n * @returns True if the gadget is running in preview mode, false otherwise.\r\n */\r\n public async isPreviewMode(): Promise<boolean> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client instanceof NoopClient;\r\n }\r\n\r\n /**\r\n * Returns the device details associated with the player running the gadget or web app.\r\n * \r\n * @returns Device details.\r\n */\r\n public async getDevice(): Promise<IDevice | null> {\r\n\r\n const client = await this.getClient();\r\n\r\n let obj: any = JSON.parse(<string>await client.getDevice());\r\n\r\n const device: IDevice[] = [obj].map((device: any) => {\r\n\r\n return {\r\n name: device.name,\r\n registrationKey: device.key,\r\n deviceType: device.devicetype,\r\n enteredService: new Date(device.enteredservice),\r\n langCode: device.langcode,\r\n timeZone: device.timezone,\r\n tags: device.description?.split('\\n'),\r\n location: {\r\n city: device.location?.city,\r\n state: device.location?.state,\r\n country: device.location?.country,\r\n postalCode: device.location?.postalcode,\r\n address: device.location?.address,\r\n latitude: device.location?.latitude,\r\n longitude: device.location?.longitude\r\n }\r\n }\r\n });\r\n return device[0];\r\n }\r\n\r\n /**\r\n * Returns the width of the visualization area.\r\n * \r\n * @returns Width of the visualization area\r\n */\r\n public async getWidth(): Promise<number | null> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getWidth();\r\n }\r\n\r\n /**\r\n * Returns the height of the visualization area.\r\n * \r\n * @returns Height of the visualization area\r\n */\r\n public async getHeight(): Promise<number | null> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getHeight();\r\n }\r\n\r\n /**\r\n * Returns the duration of the currently playing source.\r\n * (only applicable when associated with a playlist)\r\n * \r\n * @returns Duration of the current item in milliseconds\r\n */\r\n public async getDuration(): Promise<number | null> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDuration();\r\n }\r\n\r\n /**\r\n * Returns the current SDK version.\r\n * \r\n * @returns SDK version\r\n */\r\n public async getSdkVersion(): Promise<string> {\r\n\r\n return Promise.resolve(version);\r\n }\r\n\r\n\r\n // ---\r\n // PRIVATE METHODS.\r\n // ---\r\n /** @ignore */\r\n private getClient(): Promise<IClient> {\r\n\r\n if (this.clientPromise) {\r\n\r\n return (this.clientPromise);\r\n }\r\n\r\n if (window.Client) {\r\n\r\n return (this.clientPromise = Promise.resolve(window.Client));\r\n }\r\n\r\n // A \"complete\" status indicates that the \"load\" event has been fired on the\r\n // window; and, that all sub-resources such as Scripts, Images, and Frames have\r\n // been loaded.\r\n if (window.document.readyState === \"complete\") {\r\n\r\n // If this event has fired AND the 3rd-party script isn't available (see IF-\r\n // condition BEFORE this one), it means that the 3rd-party script either\r\n // failed on the network or was BLOCKED by an ad-blocker. As such, we have to\r\n // fall-back to using a mock API.\r\n return (this.clientPromise = Promise.resolve(new NoopClient()));\r\n }\r\n\r\n // ASSERT: If we made it this far, the document has not completed loading (but it\r\n // may be in an \"interactive\" state which is when I believe that the Angular app\r\n // gets bootstrapped). As such, we need bind to the LOAD event to wait for our\r\n // third-party scripts to load (or fail to load, or be blocked).\r\n this.clientPromise = new Promise<IClient>(\r\n (resolve) => {\r\n\r\n window.addEventListener(\r\n \"load\",\r\n function handleWindowLoad() {\r\n\r\n // At this point, the 3rd-party library is either available or\r\n // it's not - there's no further loading to do. If it's not\r\n // present on the global scope, we're going to fall-back to using\r\n // a mock API.\r\n resolve(window.Client || new NoopClient());\r\n }\r\n );\r\n\r\n }\r\n );\r\n\r\n return (this.clientPromise);\r\n }\r\n}\r\n\r\n\r\n\r\n// ----------------------------------------------------------------------------------- //\r\n// ----------------------------------------------------------------------------------- //\r\n\r\n// I provide a mock API for the 3rd-party script. This just allows the consuming code to\r\n// act as though the library is available even if it failed to load (example, it was\r\n// blocked by an ad-blocker).\r\n\r\n/** @ignore */\r\nclass NoopClient implements IClient {\r\n\r\n constructor() {\r\n\r\n console.log(\r\n '%cClient API not available, falling back to mock API',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }\r\n\r\n public callback(...args: any[]): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public getDeviceTime(date?: Date): Promise<string> {\r\n\r\n return Promise.resolve(new Date().toISOString());\r\n }\r\n\r\n public async getDeviceTimeZoneName(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceTimeZoneID(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceTimeZoneOffset(): Promise<number> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getLanguageCode(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceKey(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public sendCommand(name: string, arg: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string) {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public track(eventName: string, properties?: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public timeEvent(eventName: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public newEventSession(id?: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public async getRevelRoot(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getCommandMap(): Promise<string> {\r\n\r\n return Promise.resolve('{}');\r\n }\r\n\r\n public finish(): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public async getDevice(): Promise<string | null> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getWidth(): Promise<number | null> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getHeight(): Promise<number | null> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDuration(): Promise<number | null> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getSdkVersion(): Promise<string> {\r\n\r\n return Promise.resolve(version);\r\n }\r\n}\r\n","import { Injectable, enableProdMode, isDevMode } from '@angular/core';\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport * as yaml from \"js-yaml\";\r\nimport * as WebFont from 'webfontloader';\r\n\r\nconst isLocal: boolean = /localhost/.test(document.location.host);\r\n!isLocal && enableProdMode();\r\n\r\n\r\n/** @ignore */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppInitService {\r\n\r\n constructor(\r\n public http: HttpClient,\r\n private _route: ActivatedRoute,\r\n private _router: Router) {\r\n }\r\n\r\n init(): Promise<any> {\r\n\r\n return new Promise<void>(async (resolve) => {\r\n\r\n this.loadFonts();\r\n\r\n if (isDevMode()) {\r\n console.log(\r\n '%cRunning in development mode',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n\r\n /**\r\n * Shim the shindig prefs functionality for dev mode\r\n */\r\n (<any>window).gadgets = {\r\n\r\n Prefs: class {\r\n getString(key: string) { return this.getParameterByName(key) }\r\n\r\n getArray(key: string) { return this.getParameterByName(key).split(',') }\r\n\r\n getBool(key: string) { return this.getParameterByName(key) === 'true' }\r\n\r\n getCountry() { }\r\n\r\n getFloat(key: string) { return parseFloat(this.getParameterByName(key)) }\r\n\r\n getInt(key: string) { return parseInt(this.getParameterByName(key)) }\r\n\r\n getLang() { return this.getParameterByName('lang') === '' ? 'en' : this.getParameterByName('lang'); }\r\n\r\n getParameterByName(name: string, search = window.location.href): string {\r\n\r\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\r\n let regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\r\n results = regex.exec(search);\r\n if (!results) return '';\r\n if (!results[2]) return '';\r\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\r\n }\r\n }\r\n };\r\n\r\n this.http.get('assets/gadget.yaml', {\r\n responseType: 'text'\r\n }).subscribe(data => {\r\n const doc: any = yaml.load(data);\r\n let params: any = {}\r\n for (const val of doc.prefs) {\r\n params[val.name] = val.default_value\r\n }\r\n\r\n this._router.navigate([], {\r\n relativeTo: this._route,\r\n queryParams: params,\r\n });\r\n\r\n console.log(\r\n `%cUser prefs loaded successfully`,\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }, (err) => {\r\n console.log(\r\n `%cUnable to load user preferences YAML definition file: ${err}`,\r\n 'background-color:blue; color:yellow;'\r\n );\r\n console.log(\r\n `%cPlease see our developer documentation for help with your app configuration: https://developer.reveldigital.com`,\r\n 'background-color:red; color:yellow;'\r\n )\r\n })\r\n }\r\n resolve();\r\n });\r\n }\r\n\r\n\r\n private getFamilyName(css) {\r\n\r\n let FONT_FAMILY_REGEX = /font-family:\\s*(?:[&#39;&#34;])*['\"]*(.+?)['\"]*(?:[&#39;&#34;])*\\s*;/i;\r\n if (FONT_FAMILY_REGEX.test(css)) {\r\n var matches = css.match(FONT_FAMILY_REGEX);\r\n return matches[1].split(',')[0];\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n /**\r\n * Loads the given font from Google Web Fonts.\r\n */\r\n private loadFonts(): void {\r\n\r\n const parameters = new URLSearchParams(window.location.search);\r\n parameters.forEach((val, key) => {\r\n try {\r\n let fontFamily = this.getFamilyName(val);\r\n if (fontFamily !== '') {\r\n WebFont.load({\r\n google: {\r\n families: [fontFamily]\r\n },\r\n fontactive: (familyName) => {\r\n console.log(`%cActivating font: ${familyName}`,\r\n 'background-color:blue; color:yellow;');\r\n },\r\n fontinactive: (familyName) => {\r\n console.log(`%cFont inactive: ${familyName}`,\r\n 'background-color:red; color:yellow;');\r\n }\r\n });\r\n }\r\n } catch (e) {\r\n }\r\n });\r\n }\r\n}\r\n","import { Pipe, PipeTransform, NgModule } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n/**\r\n * The safe style pipe is used when custom styles are defined for a gadget and must be applied to an Angular\r\n * component. This pipe will ensure the style can be appied safely by utilizing the DomSanitizer.\r\n * \r\n * @example\r\n * <h2 [style]=\"style | safeStyle\">Sample Pref: {{ prefs.getString('myStringPref') }}</h2>\r\n */\r\n@Pipe({\r\n name: 'safeStyle',\r\n})\r\nexport class SafeStylePipe implements PipeTransform {\r\n constructor(private sanitized: DomSanitizer) { }\r\n\r\n transform(value: any): unknown {\r\n return this.sanitized.bypassSecurityTrustStyle(value);\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [SafeStylePipe],\r\n exports: [SafeStylePipe],\r\n})\r\nexport class NgSafeStylePipeModule { }\r\n","import { APP_INITIALIZER, LOCALE_ID, NgModule } from '@angular/core';\nimport { PlayerClientService } from './player-client.service';\nimport { AppInitService } from './app-init.service';\nimport { HttpClientModule } from '@angular/common/http';\nimport { RouterModule } from '@angular/router';\nimport { APP_BASE_HREF } from '@angular/common';\nimport { NgSafeStylePipeModule } from './safe-style.pipe';\n\ndeclare var gadgets: any;\n\n\n@NgModule({\n imports: [\n HttpClientModule,\n RouterModule.forRoot([]),\n NgSafeStylePipeModule\n ],\n exports: [\n NgSafeStylePipeModule\n ],\n providers: [{\n provide: APP_INITIALIZER,\n useFactory: initializeApp,\n deps: [AppInitService, PlayerClientService],\n multi: true\n },\n {\n provide: LOCALE_ID,\n useFactory: () => {\n try {\n return new gadgets.Prefs().getLang();\n } catch {\n return 'en';\n }\n }\n },\n { provide: APP_BASE_HREF, useValue: '/gadgets/ifr' }]\n})\nexport class PlayerClientModule { }\n\nfunction initializeApp(appInitService: AppInitService) {\n return async () => {\n PlayerClientService.init({});\n await appInitService.init();\n }\n}\n","/*\n * Public API Surface of player-client\n */\n\nexport * from './lib/player-client.service';\nexport * from './lib/player-client.module';\nexport * from './lib/safe-style.pipe';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -11,6 +11,9 @@ import { RouterModule } from '@angular/router';
11
11
  import { APP_BASE_HREF } from '@angular/common';
12
12
  import * as i1$1 from '@angular/platform-browser';
13
13
 
14
+ // Generated by genversion.
15
+ const version = '1.0.10';
16
+
14
17
  class PlayerClientService {
15
18
  // private onPostMessageSub: Subscription;
16
19
  // private onPostMessageEvt$ = fromEvent(window, 'message').pipe(
@@ -325,6 +328,42 @@ class PlayerClientService {
325
328
  });
326
329
  return device[0];
327
330
  }
331
+ /**
332
+ * Returns the width of the visualization area.
333
+ *
334
+ * @returns Width of the visualization area
335
+ */
336
+ async getWidth() {
337
+ const client = await this.getClient();
338
+ return client.getWidth();
339
+ }
340
+ /**
341
+ * Returns the height of the visualization area.
342
+ *
343
+ * @returns Height of the visualization area
344
+ */
345
+ async getHeight() {
346
+ const client = await this.getClient();
347
+ return client.getHeight();
348
+ }
349
+ /**
350
+ * Returns the duration of the currently playing source.
351
+ * (only applicable when associated with a playlist)
352
+ *
353
+ * @returns Duration of the current item in milliseconds
354
+ */
355
+ async getDuration() {
356
+ const client = await this.getClient();
357
+ return client.getDuration();
358
+ }
359
+ /**
360
+ * Returns the current SDK version.
361
+ *
362
+ * @returns SDK version
363
+ */
364
+ async getSdkVersion() {
365
+ return Promise.resolve(version);
366
+ }
328
367
  // ---
329
368
  // PRIVATE METHODS.
330
369
  // ---
@@ -422,11 +461,23 @@ class NoopClient {
422
461
  async getCommandMap() {
423
462
  return Promise.resolve('{}');
424
463
  }
464
+ finish() {
465
+ // NOOP implement, nothing to do....
466
+ }
425
467
  async getDevice() {
426
468
  return Promise.resolve(null);
427
469
  }
428
- finish() {
429
- // NOOP implement, nothing to do....
470
+ async getWidth() {
471
+ return Promise.resolve(null);
472
+ }
473
+ async getHeight() {
474
+ return Promise.resolve(null);
475
+ }
476
+ async getDuration() {
477
+ return Promise.resolve(null);
478
+ }
479
+ async getSdkVersion() {
480
+ return Promise.resolve(version);
430
481
  }
431
482
  }
432
483
 
@@ -1 +1 @@
1
- {"version":3,"file":"reveldigital-player-client.mjs","sources":["../../../../projects/reveldigital/player-client/src/lib/player-client.service.ts","../../../../projects/reveldigital/player-client/src/lib/app-init.service.ts","../../../../projects/reveldigital/player-client/src/lib/safe-style.pipe.ts","../../../../projects/reveldigital/player-client/src/lib/player-client.module.ts","../../../../projects/reveldigital/player-client/src/public-api.ts","../../../../projects/reveldigital/player-client/src/reveldigital-player-client.ts"],"sourcesContent":["import { Injectable, NgZone, OnDestroy } from '@angular/core';\r\nimport { gadgets } from '@reveldigital/gadget-types';\r\nimport { BehaviorSubject, fromEvent, Subject, Subscription } from 'rxjs';\r\nimport { map, share, tap } from 'rxjs/operators';\r\nimport { ICommand } from './interfaces/command.interface';\r\nimport { IDevice } from './interfaces/device.interface';\r\nimport { IEventProperties } from './interfaces/event-properties.interface';\r\nimport { IClient } from './interfaces/client.interface';\r\n\r\n\r\n// So that TypeScript doesn't complain, we're going to augment the GLOBAL / WINDOW \r\n// name-space definition to include the Tracker API. This also provides us with a place\r\n// to actually DOCUMENT the API so that our developers aren't guessing about what's\r\n// available on the library.\r\n\r\n/** @ignore */\r\ndeclare global {\r\n var Client: IClient;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PlayerClientService implements OnDestroy {\r\n\r\n /** @ignore */\r\n private clientPromise: Promise<IClient> | null;\r\n\r\n /**\r\n * Commands sent to this player.\r\n */\r\n public onCommand$ = new Subject<ICommand>();\r\n /**\r\n * Signals the gadget has been loaded and is ready to start.\r\n */\r\n public onReady$ = new BehaviorSubject(false);\r\n /**\r\n * Signals the gadget has been started by the player.\r\n */\r\n public onStart$ = new Subject();\r\n /**\r\n * Signals the gadgets has been stopped by the player.\r\n */\r\n public onStop$ = new Subject();\r\n\r\n //\r\n // Two methods available for calling into the library:\r\n //\r\n // 1) Using dispatchEvent() with the following custom events\r\n // 2) Using the window scoped RevelDigital object as defined in the constructor\r\n //\r\n /** @ignore */\r\n private onStartSub: Subscription;\r\n /** @ignore */\r\n private onStartEvt$ = fromEvent(document, 'RevelDigital.Start').pipe(\r\n share(),\r\n tap(this.onStart$)\r\n );\r\n /** @ignore */\r\n private onStopSub: Subscription;\r\n /** @ignore */\r\n private onStopEvt$ = fromEvent(document, 'RevelDigital.Stop').pipe(\r\n share(),\r\n tap(this.onStop$)\r\n );\r\n /** @ignore */\r\n private onCommandSub: Subscription;\r\n /** @ignore */\r\n private onCommandEvt$ = fromEvent<ICommand>(document, 'RevelDigital.Command').pipe(\r\n map((e: any) => { return { name: e.detail.name, arg: e.detail.arg } as ICommand }),\r\n share(),\r\n tap(this.onCommand$)\r\n );\r\n\r\n // private onPostMessageSub: Subscription;\r\n // private onPostMessageEvt$ = fromEvent(window, 'message').pipe(\r\n // filter((messageEvent: MessageEvent) =>\r\n // messageEvent.source !== window.parent &&\r\n // typeof messageEvent.data === 'string' &&\r\n // messageEvent.data.startsWith('reveldigital:')),\r\n // map((e: any) => { return JSON.parse(e.substring(13)) as Command }),\r\n // share(),\r\n // tap(this.onCommand$)\r\n // );\r\n\r\n /** @ignore */\r\n constructor(zone: NgZone) {\r\n\r\n let self = this;\r\n (window as any).RevelDigital = {\r\n Controller: {\r\n onCommand: function (name: string, arg: string) {\r\n zone.run(() => {\r\n self.onCommand$.next({ name: name, arg: arg });\r\n });\r\n },\r\n onStart: function () {\r\n zone.run(() => {\r\n self.onStart$.next(null);\r\n });\r\n },\r\n onStop: function () {\r\n zone.run(() => {\r\n self.onStop$.next(null);\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.onStartSub = this.onStartEvt$.subscribe(() => { });\r\n this.onStopSub = this.onStopEvt$.subscribe(() => { });\r\n this.onCommandSub = this.onCommandEvt$.subscribe(() => { });\r\n\r\n this.clientPromise = null;\r\n\r\n this.onReady$.next(true);\r\n }\r\n\r\n /** @ignore */\r\n ngOnDestroy(): void {\r\n\r\n this.onStartSub?.unsubscribe();\r\n this.onStopSub?.unsubscribe();\r\n this.onCommandSub?.unsubscribe();\r\n\r\n this.onReady$.next(false);\r\n }\r\n\r\n /** @ignore */\r\n public static init(data: any) {\r\n\r\n console.log(\r\n '%c⚙️ Initializing Revel Digital client library',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }\r\n\r\n /**\r\n * This method allows the gadget to communicate with player scripting.\r\n * If the appropriate scripting is in place in the currently running template, calling this method\r\n * will initiate a callback which can be acted upon in player script.\r\n * \r\n * @example\r\n * client.callback('test', 'this');\r\n * \r\n * @param args variable number of arguments\r\n */\r\n public callback(...args: any[]): void {\r\n\r\n this.getClient().then((client) => {\r\n\r\n switch (args.length) {\r\n case 0:\r\n client.callback();\r\n break;\r\n case 1:\r\n client.callback(args[0]);\r\n break;\r\n case 2:\r\n client.callback(args[1]);\r\n break;\r\n case 3:\r\n client.callback(args[2]);\r\n break;\r\n case 4:\r\n client.callback(args[3]);\r\n break;\r\n case 5:\r\n client.callback(args[4]);\r\n break;\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Accessor method for the user preferences interface exposed by the Gadgets API.\r\n * \r\n * See {@link https://developers.google.com/gadgets/docs/basic} for more details on the Gadgets API.\r\n * \r\n * @example\r\n * constructor(public client: PlayerClientService) {\r\n * let prefs = client.getPrefs();\r\n * let myString = prefs.getString('myStringPref');\r\n * }\r\n * @returns {gadgets.Prefs} Gadget API Prefs object\r\n */\r\n public getPrefs(): gadgets.Prefs {\r\n\r\n return new window['gadgets']['Prefs']();\r\n }\r\n\r\n /**\r\n * Returns the current device time in ISO8601 format.\r\n * Current device time is determined by the device timezone assigned to the device in the CMS.\r\n * \r\n * @param date Optional. If supplied will translate the supplied date/time to device time based on respective timezones.\r\n * @returns Date/time in ISO8601 format\r\n */\r\n public async getDeviceTime(date?: Date): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n if (date !== undefined) {\r\n return client.getDeviceTime(date);\r\n }\r\n return client.getDeviceTime();\r\n }\r\n\r\n /**\r\n * Returns the timezone name currently assigned to the device.\r\n * \r\n * @returns Timezone Name\r\n */\r\n public async getDeviceTimeZoneName(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneName();\r\n }\r\n\r\n /**\r\n * Returns the timezone ID currently assigned to the device.\r\n * \r\n * @returns Timezone ID\r\n */\r\n public async getDeviceTimeZoneID(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneID();\r\n }\r\n\r\n /**\r\n * Returns the numerical offset from GMT of the timezone currently assigned to the device.\r\n * \r\n * @returns Timezone offset\r\n */\r\n public async getDeviceTimeZoneOffset(): Promise<number> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneOffset();\r\n }\r\n\r\n /**\r\n * Returns the language code of the language currently assigned to the device.\r\n * \r\n * @returns Language code\r\n */\r\n public async getLanguageCode(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getLanguageCode();\r\n }\r\n\r\n /**\r\n * Returns the unique Revel Digital device key associated with the device.\r\n * \r\n * @returns Device key\r\n */\r\n public async getDeviceKey(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceKey();\r\n }\r\n\r\n /**\r\n * Send a command to the player device.\r\n * \r\n * @param name Command name\r\n * @param arg Command argument\r\n */\r\n public sendCommand(name: string, arg: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.sendCommand(name, arg);\r\n })\r\n }\r\n\r\n /**\r\n * Send a command to any remote player with the supplied device key(s).\r\n * Note: Remote commands can only be delivered to devices within the same account as the sender device.\r\n * \r\n * @param deviceKeys Array of remote device keys\r\n * @param name Command name\r\n * @param arg Command arg\r\n */\r\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.sendRemoteCommand(deviceKeys, name, arg);\r\n });\r\n }\r\n\r\n /**\r\n * Log an event for use with AdHawk analytics.\r\n * Events are used for tracking various metrics including usage statistics, player condition, state changes, etc.\r\n * \r\n * @param eventName Unique name for this event\r\n * @param properties A map of user defined properties to associate with this event\r\n */\r\n public track(eventName: string, properties?: IEventProperties): void {\r\n\r\n this.getClient().then((client) => {\r\n client.track(eventName, JSON.stringify(properties));\r\n })\r\n }\r\n\r\n /**\r\n * Method for initiating a timed event.\r\n * Timed events are useful for tracking the duration of an event and must be proceeded with a call to track().\r\n * \r\n * @example\r\n * client.timeEvent('testEvent');\r\n * client.track(\"test\", { \"a\": \"b\" });\r\n * @param eventName Unique name for this event\r\n */\r\n public timeEvent(eventName: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.timeEvent(eventName);\r\n })\r\n }\r\n\r\n /**\r\n * A session is a way of grouping events together. Each event has an associated session ID.\r\n * Session ID's are randomly generated and reset by subsequent calls to newEventSession().\r\n * \r\n * Each call to track() will utilize the same session ID, until another call to newEventSession().\r\n * @param id Optional. User supplied session ID. If not supplied a random session ID will be generated.\r\n */\r\n public newEventSession(id?: string): void {\r\n\r\n this.getClient().then((client) => {\r\n if (id !== undefined) {\r\n client.newEventSession();\r\n } else {\r\n client.newEventSession(id);\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Returns the root folder utilized by this player device.\r\n * \r\n * @returns Path to the root folder\r\n */\r\n public async getRevelRoot(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getRevelRoot();\r\n }\r\n\r\n /**\r\n * Returns a map of commands currently active for this device.\r\n * \r\n * @returns Map of commands currently active for this device.\r\n */\r\n public async getCommandMap(): Promise<any> {\r\n\r\n const client = await this.getClient();\r\n\r\n return JSON.parse(await client.getCommandMap());\r\n }\r\n\r\n /**\r\n * Indicate to the player that this gadget has finished it's visualization.\r\n * This allows the player to proceed with the next item in a playlist if applicable.\r\n */\r\n public finish(): void {\r\n\r\n this.getClient().then((client) => {\r\n\r\n client.finish();\r\n })\r\n }\r\n\r\n /**\r\n * Check is the gadget is running in preview mode. Preview mode is enabled when the gadget is\r\n * being edited in the CMS, or otherwise not running in a normal player environment.\r\n * \r\n * @returns True if the gadget is running in preview mode, false otherwise.\r\n */\r\n public async isPreviewMode(): Promise<boolean> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client instanceof NoopClient;\r\n }\r\n\r\n /**\r\n * Returns the device details associated with the player running the gadget or web app.\r\n * \r\n * @returns Device details.\r\n */\r\n public async getDevice(): Promise<IDevice | null> {\r\n\r\n const client = await this.getClient();\r\n\r\n let obj: any = JSON.parse(<string>await client.getDevice());\r\n\r\n const device: IDevice[] = [obj].map((device: any) => {\r\n\r\n return {\r\n name: device.name,\r\n registrationKey: device.key,\r\n deviceType: device.devicetype,\r\n enteredService: new Date(device.enteredservice),\r\n langCode: device.langcode,\r\n timeZone: device.timezone,\r\n tags: device.description?.split('\\n'),\r\n location: {\r\n city: device.location?.city,\r\n state: device.location?.state,\r\n country: device.location?.country,\r\n postalCode: device.location?.postalcode,\r\n address: device.location?.address,\r\n latitude: device.location?.latitude,\r\n longitude: device.location?.longitude\r\n }\r\n }\r\n });\r\n return device[0];\r\n }\r\n\r\n // ---\r\n // PRIVATE METHODS.\r\n // ---\r\n /** @ignore */\r\n private getClient(): Promise<IClient> {\r\n\r\n if (this.clientPromise) {\r\n\r\n return (this.clientPromise);\r\n }\r\n\r\n if (window.Client) {\r\n\r\n return (this.clientPromise = Promise.resolve(window.Client));\r\n }\r\n\r\n // A \"complete\" status indicates that the \"load\" event has been fired on the\r\n // window; and, that all sub-resources such as Scripts, Images, and Frames have\r\n // been loaded.\r\n if (window.document.readyState === \"complete\") {\r\n\r\n // If this event has fired AND the 3rd-party script isn't available (see IF-\r\n // condition BEFORE this one), it means that the 3rd-party script either\r\n // failed on the network or was BLOCKED by an ad-blocker. As such, we have to\r\n // fall-back to using a mock API.\r\n return (this.clientPromise = Promise.resolve(new NoopClient()));\r\n }\r\n\r\n // ASSERT: If we made it this far, the document has not completed loading (but it\r\n // may be in an \"interactive\" state which is when I believe that the Angular app\r\n // gets bootstrapped). As such, we need bind to the LOAD event to wait for our\r\n // third-party scripts to load (or fail to load, or be blocked).\r\n this.clientPromise = new Promise<IClient>(\r\n (resolve) => {\r\n\r\n window.addEventListener(\r\n \"load\",\r\n function handleWindowLoad() {\r\n\r\n // At this point, the 3rd-party library is either available or\r\n // it's not - there's no further loading to do. If it's not\r\n // present on the global scope, we're going to fall-back to using\r\n // a mock API.\r\n resolve(window.Client || new NoopClient());\r\n }\r\n );\r\n\r\n }\r\n );\r\n\r\n return (this.clientPromise);\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n// ----------------------------------------------------------------------------------- //\r\n// ----------------------------------------------------------------------------------- //\r\n\r\n// I provide a mock API for the 3rd-party script. This just allows the consuming code to\r\n// act as though the library is available even if it failed to load (example, it was\r\n// blocked by an ad-blocker).\r\n\r\n/** @ignore */\r\nclass NoopClient implements IClient {\r\n\r\n constructor() {\r\n\r\n console.log(\r\n '%cClient API not available, falling back to mock API',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }\r\n\r\n public callback(...args: any[]): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public getDeviceTime(date?: Date): Promise<string> {\r\n\r\n return Promise.resolve(new Date().toISOString());\r\n }\r\n\r\n public async getDeviceTimeZoneName(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceTimeZoneID(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceTimeZoneOffset(): Promise<number> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getLanguageCode(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceKey(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public sendCommand(name: string, arg: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string) {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public track(eventName: string, properties?: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public timeEvent(eventName: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public newEventSession(id?: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public async getRevelRoot(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getCommandMap(): Promise<string> {\r\n\r\n return Promise.resolve('{}');\r\n }\r\n\r\n public async getDevice(): Promise<string | null> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public finish(): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n}\r\n","import { Injectable, enableProdMode, isDevMode } from '@angular/core';\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport * as yaml from \"js-yaml\";\r\nimport * as WebFont from 'webfontloader';\r\n\r\nconst isLocal: boolean = /localhost/.test(document.location.host);\r\n!isLocal && enableProdMode();\r\n\r\n\r\n/** @ignore */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppInitService {\r\n\r\n constructor(\r\n public http: HttpClient,\r\n private _route: ActivatedRoute,\r\n private _router: Router) {\r\n }\r\n\r\n init(): Promise<any> {\r\n\r\n return new Promise<void>(async (resolve) => {\r\n\r\n this.loadFonts();\r\n\r\n if (isDevMode()) {\r\n console.log(\r\n '%cRunning in development mode',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n\r\n /**\r\n * Shim the shindig prefs functionality for dev mode\r\n */\r\n (<any>window).gadgets = {\r\n\r\n Prefs: class {\r\n getString(key: string) { return this.getParameterByName(key) }\r\n\r\n getArray(key: string) { return this.getParameterByName(key).split(',') }\r\n\r\n getBool(key: string) { return this.getParameterByName(key) === 'true' }\r\n\r\n getCountry() { }\r\n\r\n getFloat(key: string) { return parseFloat(this.getParameterByName(key)) }\r\n\r\n getInt(key: string) { return parseInt(this.getParameterByName(key)) }\r\n\r\n getLang() { return this.getParameterByName('lang') === '' ? 'en' : this.getParameterByName('lang'); }\r\n\r\n getParameterByName(name: string, search = window.location.href): string {\r\n\r\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\r\n let regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\r\n results = regex.exec(search);\r\n if (!results) return '';\r\n if (!results[2]) return '';\r\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\r\n }\r\n }\r\n };\r\n\r\n this.http.get('assets/gadget.yaml', {\r\n responseType: 'text'\r\n }).subscribe(data => {\r\n const doc: any = yaml.load(data);\r\n let params: any = {}\r\n for (const val of doc.prefs) {\r\n params[val.name] = val.default_value\r\n }\r\n\r\n this._router.navigate([], {\r\n relativeTo: this._route,\r\n queryParams: params,\r\n });\r\n\r\n console.log(\r\n `%cUser prefs loaded successfully`,\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }, (err) => {\r\n console.log(\r\n `%cUnable to load user preferences YAML definition file: ${err}`,\r\n 'background-color:blue; color:yellow;'\r\n );\r\n console.log(\r\n `%cPlease see our developer documentation for help with your app configuration: https://developer.reveldigital.com`,\r\n 'background-color:red; color:yellow;'\r\n )\r\n })\r\n }\r\n resolve();\r\n });\r\n }\r\n\r\n\r\n private getFamilyName(css) {\r\n\r\n let FONT_FAMILY_REGEX = /font-family:\\s*(?:[&#39;&#34;])*['\"]*(.+?)['\"]*(?:[&#39;&#34;])*\\s*;/i;\r\n if (FONT_FAMILY_REGEX.test(css)) {\r\n var matches = css.match(FONT_FAMILY_REGEX);\r\n return matches[1].split(',')[0];\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n /**\r\n * Loads the given font from Google Web Fonts.\r\n */\r\n private loadFonts(): void {\r\n\r\n const parameters = new URLSearchParams(window.location.search);\r\n parameters.forEach((val, key) => {\r\n try {\r\n let fontFamily = this.getFamilyName(val);\r\n if (fontFamily !== '') {\r\n WebFont.load({\r\n google: {\r\n families: [fontFamily]\r\n },\r\n fontactive: (familyName) => {\r\n console.log(`%cActivating font: ${familyName}`,\r\n 'background-color:blue; color:yellow;');\r\n },\r\n fontinactive: (familyName) => {\r\n console.log(`%cFont inactive: ${familyName}`,\r\n 'background-color:red; color:yellow;');\r\n }\r\n });\r\n }\r\n } catch (e) {\r\n }\r\n });\r\n }\r\n}\r\n","import { Pipe, PipeTransform, NgModule } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n/**\r\n * The safe style pipe is used when custom styles are defined for a gadget and must be applied to an Angular\r\n * component. This pipe will ensure the style can be appied safely by utilizing the DomSanitizer.\r\n * \r\n * @example\r\n * <h2 [style]=\"style | safeStyle\">Sample Pref: {{ prefs.getString('myStringPref') }}</h2>\r\n */\r\n@Pipe({\r\n name: 'safeStyle',\r\n})\r\nexport class SafeStylePipe implements PipeTransform {\r\n constructor(private sanitized: DomSanitizer) { }\r\n\r\n transform(value: any): unknown {\r\n return this.sanitized.bypassSecurityTrustStyle(value);\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [SafeStylePipe],\r\n exports: [SafeStylePipe],\r\n})\r\nexport class NgSafeStylePipeModule { }\r\n","import { APP_INITIALIZER, LOCALE_ID, NgModule } from '@angular/core';\nimport { PlayerClientService } from './player-client.service';\nimport { AppInitService } from './app-init.service';\nimport { HttpClientModule } from '@angular/common/http';\nimport { RouterModule } from '@angular/router';\nimport { APP_BASE_HREF } from '@angular/common';\nimport { NgSafeStylePipeModule } from './safe-style.pipe';\n\ndeclare var gadgets: any;\n\n\n@NgModule({\n imports: [\n HttpClientModule,\n RouterModule.forRoot([]),\n NgSafeStylePipeModule\n ],\n exports: [\n NgSafeStylePipeModule\n ],\n providers: [{\n provide: APP_INITIALIZER,\n useFactory: initializeApp,\n deps: [AppInitService, PlayerClientService],\n multi: true\n },\n {\n provide: LOCALE_ID,\n useFactory: () => {\n try {\n return new gadgets.Prefs().getLang();\n } catch {\n return 'en';\n }\n }\n },\n { provide: APP_BASE_HREF, useValue: '/gadgets/ifr' }]\n})\nexport class PlayerClientModule { }\n\nfunction initializeApp(appInitService: AppInitService) {\n return async () => {\n PlayerClientService.init({});\n await appInitService.init();\n }\n}\n","/*\n * Public API Surface of player-client\n */\n\nexport * from './lib/player-client.service';\nexport * from './lib/player-client.module';\nexport * from './lib/safe-style.pipe';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;MAuBa,mBAAmB;;;;;;;;;;;;IA+D9B,YAAY,IAAY;;;;QAvDjB,eAAU,GAAG,IAAI,OAAO,EAAY,CAAC;;;;QAIrC,aAAQ,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;;;;QAItC,aAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;;;;QAIzB,YAAO,GAAG,IAAI,OAAO,EAAE,CAAC;;QAWvB,gBAAW,GAAG,SAAS,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC,IAAI,CAClE,KAAK,EAAE,EACP,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CACnB,CAAC;;QAIM,eAAU,GAAG,SAAS,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAChE,KAAK,EAAE,EACP,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAClB,CAAC;;QAIM,kBAAa,GAAG,SAAS,CAAW,QAAQ,EAAE,sBAAsB,CAAC,CAAC,IAAI,CAChF,GAAG,CAAC,CAAC,CAAM,OAAO,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAc,CAAA,EAAE,CAAC,EAClF,KAAK,EAAE,EACP,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CACrB,CAAC;QAgBA,IAAI,IAAI,GAAG,IAAI,CAAC;QACf,MAAc,CAAC,YAAY,GAAG;YAC7B,UAAU,EAAE;gBACV,SAAS,EAAE,UAAU,IAAY,EAAE,GAAW;oBAC5C,IAAI,CAAC,GAAG,CAAC;wBACP,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;qBAChD,CAAC,CAAC;iBACJ;gBACD,OAAO,EAAE;oBACP,IAAI,CAAC,GAAG,CAAC;wBACP,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBAC1B,CAAC,CAAC;iBACJ;gBACD,MAAM,EAAE;oBACN,IAAI,CAAC,GAAG,CAAC;wBACP,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACzB,CAAC,CAAC;iBACJ;aACF;SACF,CAAA;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE5D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAE1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC1B;;IAGD,WAAW;QAET,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;QAEjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC3B;;IAGM,OAAO,IAAI,CAAC,IAAS;QAE1B,OAAO,CAAC,GAAG,CACT,gDAAgD,EAChD,sCAAsC,CACvC,CAAC;KACH;;;;;;;;;;;IAYM,QAAQ,CAAC,GAAG,IAAW;QAE5B,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM;YAE3B,QAAQ,IAAI,CAAC,MAAM;gBACjB,KAAK,CAAC;oBACJ,MAAM,CAAC,QAAQ,EAAE,CAAC;oBAClB,MAAM;gBACR,KAAK,CAAC;oBACJ,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzB,MAAM;gBACR,KAAK,CAAC;oBACJ,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzB,MAAM;gBACR,KAAK,CAAC;oBACJ,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzB,MAAM;gBACR,KAAK,CAAC;oBACJ,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzB,MAAM;gBACR,KAAK,CAAC;oBACJ,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzB,MAAM;aACT;SACF,CAAC,CAAA;KACH;;;;;;;;;;;;;IAcM,QAAQ;QAEb,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;KACzC;;;;;;;;IASM,MAAM,aAAa,CAAC,IAAW;QAEpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEtC,IAAI,IAAI,KAAK,SAAS,EAAE;YACtB,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;SACnC;QACD,OAAO,MAAM,CAAC,aAAa,EAAE,CAAC;KAC/B;;;;;;IAOM,MAAM,qBAAqB;QAEhC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEtC,OAAO,MAAM,CAAC,qBAAqB,EAAE,CAAC;KACvC;;;;;;IAOM,MAAM,mBAAmB;QAE9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEtC,OAAO,MAAM,CAAC,mBAAmB,EAAE,CAAC;KACrC;;;;;;IAOM,MAAM,uBAAuB;QAElC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEtC,OAAO,MAAM,CAAC,uBAAuB,EAAE,CAAC;KACzC;;;;;;IAOM,MAAM,eAAe;QAE1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEtC,OAAO,MAAM,CAAC,eAAe,EAAE,CAAC;KACjC;;;;;;IAOM,MAAM,YAAY;QAEvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEtC,OAAO,MAAM,CAAC,YAAY,EAAE,CAAC;KAC9B;;;;;;;IAQM,WAAW,CAAC,IAAY,EAAE,GAAW;QAE1C,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM;YAC3B,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;SAC/B,CAAC,CAAA;KACH;;;;;;;;;IAUM,iBAAiB,CAAC,UAAoB,EAAE,IAAY,EAAE,GAAW;QAEtE,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM;YAC3B,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;SACjD,CAAC,CAAC;KACJ;;;;;;;;IASM,KAAK,CAAC,SAAiB,EAAE,UAA6B;QAE3D,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM;YAC3B,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;SACrD,CAAC,CAAA;KACH;;;;;;;;;;IAWM,SAAS,CAAC,SAAiB;QAEhC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM;YAC3B,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;SAC7B,CAAC,CAAA;KACH;;;;;;;;IASM,eAAe,CAAC,EAAW;QAEhC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM;YAC3B,IAAI,EAAE,KAAK,SAAS,EAAE;gBACpB,MAAM,CAAC,eAAe,EAAE,CAAC;aAC1B;iBAAM;gBACL,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;aAC5B;SACF,CAAC,CAAA;KACH;;;;;;IAOM,MAAM,YAAY;QAEvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEtC,OAAO,MAAM,CAAC,YAAY,EAAE,CAAC;KAC9B;;;;;;IAOM,MAAM,aAAa;QAExB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEtC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;KACjD;;;;;IAMM,MAAM;QAEX,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM;YAE3B,MAAM,CAAC,MAAM,EAAE,CAAC;SACjB,CAAC,CAAA;KACH;;;;;;;IAQM,MAAM,aAAa;QAExB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEtC,OAAO,MAAM,YAAY,UAAU,CAAC;KACrC;;;;;;IAOM,MAAM,SAAS;QAEpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEtC,IAAI,GAAG,GAAQ,IAAI,CAAC,KAAK,CAAS,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAc,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,MAAW;YAE9C,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,eAAe,EAAE,MAAM,CAAC,GAAG;gBAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,cAAc,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;gBAC/C,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC;gBACrC,QAAQ,EAAE;oBACR,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI;oBAC3B,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK;oBAC7B,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO;oBACjC,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU;oBACvC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO;oBACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ;oBACnC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS;iBACtC;aACF,CAAA;SACF,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;KAClB;;;;;IAMO,SAAS;QAEf,IAAI,IAAI,CAAC,aAAa,EAAE;YAEtB,QAAQ,IAAI,CAAC,aAAa,EAAE;SAC7B;QAED,IAAI,MAAM,CAAC,MAAM,EAAE;YAEjB,QAAQ,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;SAC9D;;;;QAKD,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE;;;;;YAM7C,QAAQ,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE;SACjE;;;;;QAMD,IAAI,CAAC,aAAa,GAAG,IAAI,OAAO,CAC9B,CAAC,OAAO;YAEN,MAAM,CAAC,gBAAgB,CACrB,MAAM,EACN,SAAS,gBAAgB;;;;;gBAMvB,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC;aAC5C,CACF,CAAC;SAEH,CACF,CAAC;QAEF,QAAQ,IAAI,CAAC,aAAa,EAAE;KAC7B;;iHAxcU,mBAAmB;qHAAnB,mBAAmB,cAFlB,MAAM;4FAEP,mBAAmB;kBAH/B,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;AA+cD;AACA;AAEA;AACA;AACA;AAEA;AACA,MAAM,UAAU;IAEd;QAEE,OAAO,CAAC,GAAG,CACT,sDAAsD,EACtD,sCAAsC,CACvC,CAAC;KACH;IAEM,QAAQ,CAAC,GAAG,IAAW;;KAG7B;IAEM,aAAa,CAAC,IAAW;QAE9B,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;KAClD;IAEM,MAAM,qBAAqB;QAEhC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9B;IAEM,MAAM,mBAAmB;QAE9B,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9B;IAEM,MAAM,uBAAuB;QAElC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9B;IAEM,MAAM,eAAe;QAE1B,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9B;IAEM,MAAM,YAAY;QAEvB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9B;IAEM,WAAW,CAAC,IAAY,EAAE,GAAW;;KAG3C;IAEM,iBAAiB,CAAC,UAAoB,EAAE,IAAY,EAAE,GAAW;;KAGvE;IAEM,KAAK,CAAC,SAAiB,EAAE,UAAmB;;KAGlD;IAEM,SAAS,CAAC,SAAiB;;KAGjC;IAEM,eAAe,CAAC,EAAW;;KAGjC;IAEM,MAAM,YAAY;QAEvB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9B;IAEM,MAAM,aAAa;QAExB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9B;IAEM,MAAM,SAAS;QAEpB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9B;IAEM,MAAM;;KAGZ;;;AC/jBH,MAAM,OAAO,GAAY,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;AAG7B;MAIa,cAAc;IAEzB,YACS,IAAgB,EACf,MAAsB,EACtB,OAAe;QAFhB,SAAI,GAAJ,IAAI,CAAY;QACf,WAAM,GAAN,MAAM,CAAgB;QACtB,YAAO,GAAP,OAAO,CAAQ;KACxB;IAED,IAAI;QAEF,OAAO,IAAI,OAAO,CAAO,OAAO,OAAO;YAErC,IAAI,CAAC,SAAS,EAAE,CAAC;YAEjB,IAAI,SAAS,EAAE,EAAE;gBACf,OAAO,CAAC,GAAG,CACT,+BAA+B,EAC/B,sCAAsC,CACvC,CAAC;;;;gBAKI,MAAO,CAAC,OAAO,GAAG;oBAEtB,KAAK,EAAE;wBACL,SAAS,CAAC,GAAW,IAAI,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA,EAAE;wBAE9D,QAAQ,CAAC,GAAW,IAAI,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,EAAE;wBAExE,OAAO,CAAC,GAAW,IAAI,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,MAAM,CAAA,EAAE;wBAEvE,UAAU,MAAM;wBAEhB,QAAQ,CAAC,GAAW,IAAI,OAAO,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE;wBAEzE,MAAM,CAAC,GAAW,IAAI,OAAO,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE;wBAErE,OAAO,KAAK,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE;wBAErG,kBAAkB,CAAC,IAAY,EAAE,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI;4BAE5D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;4BACvC,IAAI,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,mBAAmB,CAAC,EACzD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BAC/B,IAAI,CAAC,OAAO;gCAAE,OAAO,EAAE,CAAC;4BACxB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gCAAE,OAAO,EAAE,CAAC;4BAC3B,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;yBAC3D;qBACF;iBACF,CAAC;gBAEF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE;oBAClC,YAAY,EAAE,MAAM;iBACrB,CAAC,CAAC,SAAS,CAAC,IAAI;oBACf,MAAM,GAAG,GAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACjC,IAAI,MAAM,GAAQ,EAAE,CAAA;oBACpB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE;wBAC3B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,aAAa,CAAA;qBACrC;oBAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE;wBACxB,UAAU,EAAE,IAAI,CAAC,MAAM;wBACvB,WAAW,EAAE,MAAM;qBACpB,CAAC,CAAC;oBAEH,OAAO,CAAC,GAAG,CACT,kCAAkC,EAClC,sCAAsC,CACvC,CAAC;iBACH,EAAE,CAAC,GAAG;oBACL,OAAO,CAAC,GAAG,CACT,2DAA2D,GAAG,EAAE,EAChE,sCAAsC,CACvC,CAAC;oBACF,OAAO,CAAC,GAAG,CACT,mHAAmH,EACnH,qCAAqC,CACtC,CAAA;iBACF,CAAC,CAAA;aACH;YACD,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;KACJ;IAGO,aAAa,CAAC,GAAG;QAEvB,IAAI,iBAAiB,GAAG,uEAAuE,CAAC;QAChG,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAC/B,IAAI,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC3C,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SACjC;aAAM;YACL,OAAO,EAAE,CAAC;SACX;KACF;;;;IAKO,SAAS;QAEf,MAAM,UAAU,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/D,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG;YAC1B,IAAI;gBACF,IAAI,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBACzC,IAAI,UAAU,KAAK,EAAE,EAAE;oBACrB,OAAO,CAAC,IAAI,CAAC;wBACX,MAAM,EAAE;4BACN,QAAQ,EAAE,CAAC,UAAU,CAAC;yBACvB;wBACD,UAAU,EAAE,CAAC,UAAU;4BACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,EAAE,EAC5C,sCAAsC,CAAC,CAAC;yBAC3C;wBACD,YAAY,EAAE,CAAC,UAAU;4BACvB,OAAO,CAAC,GAAG,CAAC,oBAAoB,UAAU,EAAE,EAC1C,qCAAqC,CAAC,CAAC;yBAC1C;qBACF,CAAC,CAAC;iBACJ;aACF;YAAC,OAAO,CAAC,EAAE;aACX;SACF,CAAC,CAAC;KACJ;;4GA5HU,cAAc;gHAAd,cAAc,cAFb,MAAM;4FAEP,cAAc;kBAH1B,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;;ACVD;;;;;;;MAUa,aAAa;IACtB,YAAoB,SAAuB;QAAvB,cAAS,GAAT,SAAS,CAAc;KAAK;IAEhD,SAAS,CAAC,KAAU;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;KACzD;;2GALQ,aAAa;yGAAb,aAAa;4FAAb,aAAa;kBAHzB,IAAI;mBAAC;oBACF,IAAI,EAAE,WAAW;iBACpB;;MAaY,qBAAqB;;mHAArB,qBAAqB;oHAArB,qBAAqB,iBAZrB,aAAa,aAAb,aAAa;oHAYb,qBAAqB;4FAArB,qBAAqB;kBAJjC,QAAQ;mBAAC;oBACN,YAAY,EAAE,CAAC,aAAa,CAAC;oBAC7B,OAAO,EAAE,CAAC,aAAa,CAAC;iBAC3B;;;MCcY,kBAAkB;;gHAAlB,kBAAkB;iHAAlB,kBAAkB,YAzB3B,gBAAgB,mBAEhB,qBAAqB,aAGrB,qBAAqB;iHAoBZ,kBAAkB,aAlBlB,CAAC;YACV,OAAO,EAAE,eAAe;YACxB,UAAU,EAAE,aAAa;YACzB,IAAI,EAAE,CAAC,cAAc,EAAE,mBAAmB,CAAC;YAC3C,KAAK,EAAE,IAAI;SACZ;QACD;YACE,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE;gBACV,IAAI;oBACF,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;iBACtC;gBAAC,MAAM;oBACN,OAAO,IAAI,CAAC;iBACb;aACF;SACF;QACD,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,YAxB5C;YACP,gBAAgB;YAChB,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,qBAAqB;SACtB,EAEC,qBAAqB;4FAoBZ,kBAAkB;kBA3B9B,QAAQ;mBAAC;oBACR,OAAO,EAAE;wBACP,gBAAgB;wBAChB,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;wBACxB,qBAAqB;qBACtB;oBACD,OAAO,EAAE;wBACP,qBAAqB;qBACtB;oBACD,SAAS,EAAE,CAAC;4BACV,OAAO,EAAE,eAAe;4BACxB,UAAU,EAAE,aAAa;4BACzB,IAAI,EAAE,CAAC,cAAc,EAAE,mBAAmB,CAAC;4BAC3C,KAAK,EAAE,IAAI;yBACZ;wBACD;4BACE,OAAO,EAAE,SAAS;4BAClB,UAAU,EAAE;gCACV,IAAI;oCACF,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;iCACtC;gCAAC,MAAM;oCACN,OAAO,IAAI,CAAC;iCACb;6BACF;yBACF;wBACD,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;iBACtD;;AAGD,SAAS,aAAa,CAAC,cAA8B;IACnD,OAAO;QACL,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;KAC7B,CAAA;AACH;;AC7CA;;;;ACAA;;;;;;"}
1
+ {"version":3,"file":"reveldigital-player-client.mjs","sources":["../../../../projects/reveldigital/player-client/src/lib/version.ts","../../../../projects/reveldigital/player-client/src/lib/player-client.service.ts","../../../../projects/reveldigital/player-client/src/lib/app-init.service.ts","../../../../projects/reveldigital/player-client/src/lib/safe-style.pipe.ts","../../../../projects/reveldigital/player-client/src/lib/player-client.module.ts","../../../../projects/reveldigital/player-client/src/public-api.ts","../../../../projects/reveldigital/player-client/src/reveldigital-player-client.ts"],"sourcesContent":["// Generated by genversion.\nexport const version = '1.0.10'\n","import { Injectable, NgZone, OnDestroy } from '@angular/core';\r\nimport { gadgets } from '@reveldigital/gadget-types';\r\nimport { BehaviorSubject, fromEvent, Subject, Subscription } from 'rxjs';\r\nimport { map, share, tap } from 'rxjs/operators';\r\nimport { ICommand } from './interfaces/command.interface';\r\nimport { IDevice } from './interfaces/device.interface';\r\nimport { IEventProperties } from './interfaces/event-properties.interface';\r\nimport { IClient } from './interfaces/client.interface';\r\nimport { version } from './version';\r\n\r\n//import { version } from './version.js';\r\n\r\n// So that TypeScript doesn't complain, we're going to augment the GLOBAL / WINDOW \r\n// name-space definition to include the Tracker API. This also provides us with a place\r\n// to actually DOCUMENT the API so that our developers aren't guessing about what's\r\n// available on the library.\r\n\r\n/** @ignore */\r\ndeclare global {\r\n var Client: IClient;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PlayerClientService implements OnDestroy {\r\n\r\n /** @ignore */\r\n private clientPromise: Promise<IClient> | null;\r\n\r\n /**\r\n * Commands sent to this player.\r\n */\r\n public onCommand$ = new Subject<ICommand>();\r\n /**\r\n * Signals the gadget has been loaded and is ready to start.\r\n */\r\n public onReady$ = new BehaviorSubject(false);\r\n /**\r\n * Signals the gadget has been started by the player.\r\n */\r\n public onStart$ = new Subject();\r\n /**\r\n * Signals the gadgets has been stopped by the player.\r\n */\r\n public onStop$ = new Subject();\r\n\r\n //\r\n // Two methods available for calling into the library:\r\n //\r\n // 1) Using dispatchEvent() with the following custom events\r\n // 2) Using the window scoped RevelDigital object as defined in the constructor\r\n //\r\n /** @ignore */\r\n private onStartSub: Subscription;\r\n /** @ignore */\r\n private onStartEvt$ = fromEvent(document, 'RevelDigital.Start').pipe(\r\n share(),\r\n tap(this.onStart$)\r\n );\r\n /** @ignore */\r\n private onStopSub: Subscription;\r\n /** @ignore */\r\n private onStopEvt$ = fromEvent(document, 'RevelDigital.Stop').pipe(\r\n share(),\r\n tap(this.onStop$)\r\n );\r\n /** @ignore */\r\n private onCommandSub: Subscription;\r\n /** @ignore */\r\n private onCommandEvt$ = fromEvent<ICommand>(document, 'RevelDigital.Command').pipe(\r\n map((e: any) => { return { name: e.detail.name, arg: e.detail.arg } as ICommand }),\r\n share(),\r\n tap(this.onCommand$)\r\n );\r\n\r\n // private onPostMessageSub: Subscription;\r\n // private onPostMessageEvt$ = fromEvent(window, 'message').pipe(\r\n // filter((messageEvent: MessageEvent) =>\r\n // messageEvent.source !== window.parent &&\r\n // typeof messageEvent.data === 'string' &&\r\n // messageEvent.data.startsWith('reveldigital:')),\r\n // map((e: any) => { return JSON.parse(e.substring(13)) as Command }),\r\n // share(),\r\n // tap(this.onCommand$)\r\n // );\r\n\r\n /** @ignore */\r\n constructor(zone: NgZone) {\r\n\r\n let self = this;\r\n (window as any).RevelDigital = {\r\n Controller: {\r\n onCommand: function (name: string, arg: string) {\r\n zone.run(() => {\r\n self.onCommand$.next({ name: name, arg: arg });\r\n });\r\n },\r\n onStart: function () {\r\n zone.run(() => {\r\n self.onStart$.next(null);\r\n });\r\n },\r\n onStop: function () {\r\n zone.run(() => {\r\n self.onStop$.next(null);\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.onStartSub = this.onStartEvt$.subscribe(() => { });\r\n this.onStopSub = this.onStopEvt$.subscribe(() => { });\r\n this.onCommandSub = this.onCommandEvt$.subscribe(() => { });\r\n\r\n this.clientPromise = null;\r\n\r\n this.onReady$.next(true);\r\n }\r\n\r\n /** @ignore */\r\n ngOnDestroy(): void {\r\n\r\n this.onStartSub?.unsubscribe();\r\n this.onStopSub?.unsubscribe();\r\n this.onCommandSub?.unsubscribe();\r\n\r\n this.onReady$.next(false);\r\n }\r\n\r\n /** @ignore */\r\n public static init(data: any) {\r\n\r\n console.log(\r\n '%c⚙️ Initializing Revel Digital client library',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }\r\n\r\n /**\r\n * This method allows the gadget to communicate with player scripting.\r\n * If the appropriate scripting is in place in the currently running template, calling this method\r\n * will initiate a callback which can be acted upon in player script.\r\n * \r\n * @example\r\n * client.callback('test', 'this');\r\n * \r\n * @param args variable number of arguments\r\n */\r\n public callback(...args: any[]): void {\r\n\r\n this.getClient().then((client) => {\r\n\r\n switch (args.length) {\r\n case 0:\r\n client.callback();\r\n break;\r\n case 1:\r\n client.callback(args[0]);\r\n break;\r\n case 2:\r\n client.callback(args[1]);\r\n break;\r\n case 3:\r\n client.callback(args[2]);\r\n break;\r\n case 4:\r\n client.callback(args[3]);\r\n break;\r\n case 5:\r\n client.callback(args[4]);\r\n break;\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Accessor method for the user preferences interface exposed by the Gadgets API.\r\n * \r\n * See {@link https://developers.google.com/gadgets/docs/basic} for more details on the Gadgets API.\r\n * \r\n * @example\r\n * constructor(public client: PlayerClientService) {\r\n * let prefs = client.getPrefs();\r\n * let myString = prefs.getString('myStringPref');\r\n * }\r\n * @returns {gadgets.Prefs} Gadget API Prefs object\r\n */\r\n public getPrefs(): gadgets.Prefs {\r\n\r\n return new window['gadgets']['Prefs']();\r\n }\r\n\r\n /**\r\n * Returns the current device time in ISO8601 format.\r\n * Current device time is determined by the device timezone assigned to the device in the CMS.\r\n * \r\n * @param date Optional. If supplied will translate the supplied date/time to device time based on respective timezones.\r\n * @returns Date/time in ISO8601 format\r\n */\r\n public async getDeviceTime(date?: Date): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n if (date !== undefined) {\r\n return client.getDeviceTime(date);\r\n }\r\n return client.getDeviceTime();\r\n }\r\n\r\n /**\r\n * Returns the timezone name currently assigned to the device.\r\n * \r\n * @returns Timezone Name\r\n */\r\n public async getDeviceTimeZoneName(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneName();\r\n }\r\n\r\n /**\r\n * Returns the timezone ID currently assigned to the device.\r\n * \r\n * @returns Timezone ID\r\n */\r\n public async getDeviceTimeZoneID(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneID();\r\n }\r\n\r\n /**\r\n * Returns the numerical offset from GMT of the timezone currently assigned to the device.\r\n * \r\n * @returns Timezone offset\r\n */\r\n public async getDeviceTimeZoneOffset(): Promise<number> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceTimeZoneOffset();\r\n }\r\n\r\n /**\r\n * Returns the language code of the language currently assigned to the device.\r\n * \r\n * @returns Language code\r\n */\r\n public async getLanguageCode(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getLanguageCode();\r\n }\r\n\r\n /**\r\n * Returns the unique Revel Digital device key associated with the device.\r\n * \r\n * @returns Device key\r\n */\r\n public async getDeviceKey(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDeviceKey();\r\n }\r\n\r\n /**\r\n * Send a command to the player device.\r\n * \r\n * @param name Command name\r\n * @param arg Command argument\r\n */\r\n public sendCommand(name: string, arg: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.sendCommand(name, arg);\r\n })\r\n }\r\n\r\n /**\r\n * Send a command to any remote player with the supplied device key(s).\r\n * Note: Remote commands can only be delivered to devices within the same account as the sender device.\r\n * \r\n * @param deviceKeys Array of remote device keys\r\n * @param name Command name\r\n * @param arg Command arg\r\n */\r\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.sendRemoteCommand(deviceKeys, name, arg);\r\n });\r\n }\r\n\r\n /**\r\n * Log an event for use with AdHawk analytics.\r\n * Events are used for tracking various metrics including usage statistics, player condition, state changes, etc.\r\n * \r\n * @param eventName Unique name for this event\r\n * @param properties A map of user defined properties to associate with this event\r\n */\r\n public track(eventName: string, properties?: IEventProperties): void {\r\n\r\n this.getClient().then((client) => {\r\n client.track(eventName, JSON.stringify(properties));\r\n })\r\n }\r\n\r\n /**\r\n * Method for initiating a timed event.\r\n * Timed events are useful for tracking the duration of an event and must be proceeded with a call to track().\r\n * \r\n * @example\r\n * client.timeEvent('testEvent');\r\n * client.track(\"test\", { \"a\": \"b\" });\r\n * @param eventName Unique name for this event\r\n */\r\n public timeEvent(eventName: string): void {\r\n\r\n this.getClient().then((client) => {\r\n client.timeEvent(eventName);\r\n })\r\n }\r\n\r\n /**\r\n * A session is a way of grouping events together. Each event has an associated session ID.\r\n * Session ID's are randomly generated and reset by subsequent calls to newEventSession().\r\n * \r\n * Each call to track() will utilize the same session ID, until another call to newEventSession().\r\n * @param id Optional. User supplied session ID. If not supplied a random session ID will be generated.\r\n */\r\n public newEventSession(id?: string): void {\r\n\r\n this.getClient().then((client) => {\r\n if (id !== undefined) {\r\n client.newEventSession();\r\n } else {\r\n client.newEventSession(id);\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Returns the root folder utilized by this player device.\r\n * \r\n * @returns Path to the root folder\r\n */\r\n public async getRevelRoot(): Promise<string> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getRevelRoot();\r\n }\r\n\r\n /**\r\n * Returns a map of commands currently active for this device.\r\n * \r\n * @returns Map of commands currently active for this device.\r\n */\r\n public async getCommandMap(): Promise<any> {\r\n\r\n const client = await this.getClient();\r\n\r\n return JSON.parse(await client.getCommandMap());\r\n }\r\n\r\n /**\r\n * Indicate to the player that this gadget has finished it's visualization.\r\n * This allows the player to proceed with the next item in a playlist if applicable.\r\n */\r\n public finish(): void {\r\n\r\n this.getClient().then((client) => {\r\n\r\n client.finish();\r\n })\r\n }\r\n\r\n /**\r\n * Check is the gadget is running in preview mode. Preview mode is enabled when the gadget is\r\n * being edited in the CMS, or otherwise not running in a normal player environment.\r\n * \r\n * @returns True if the gadget is running in preview mode, false otherwise.\r\n */\r\n public async isPreviewMode(): Promise<boolean> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client instanceof NoopClient;\r\n }\r\n\r\n /**\r\n * Returns the device details associated with the player running the gadget or web app.\r\n * \r\n * @returns Device details.\r\n */\r\n public async getDevice(): Promise<IDevice | null> {\r\n\r\n const client = await this.getClient();\r\n\r\n let obj: any = JSON.parse(<string>await client.getDevice());\r\n\r\n const device: IDevice[] = [obj].map((device: any) => {\r\n\r\n return {\r\n name: device.name,\r\n registrationKey: device.key,\r\n deviceType: device.devicetype,\r\n enteredService: new Date(device.enteredservice),\r\n langCode: device.langcode,\r\n timeZone: device.timezone,\r\n tags: device.description?.split('\\n'),\r\n location: {\r\n city: device.location?.city,\r\n state: device.location?.state,\r\n country: device.location?.country,\r\n postalCode: device.location?.postalcode,\r\n address: device.location?.address,\r\n latitude: device.location?.latitude,\r\n longitude: device.location?.longitude\r\n }\r\n }\r\n });\r\n return device[0];\r\n }\r\n\r\n /**\r\n * Returns the width of the visualization area.\r\n * \r\n * @returns Width of the visualization area\r\n */\r\n public async getWidth(): Promise<number | null> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getWidth();\r\n }\r\n\r\n /**\r\n * Returns the height of the visualization area.\r\n * \r\n * @returns Height of the visualization area\r\n */\r\n public async getHeight(): Promise<number | null> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getHeight();\r\n }\r\n\r\n /**\r\n * Returns the duration of the currently playing source.\r\n * (only applicable when associated with a playlist)\r\n * \r\n * @returns Duration of the current item in milliseconds\r\n */\r\n public async getDuration(): Promise<number | null> {\r\n\r\n const client = await this.getClient();\r\n\r\n return client.getDuration();\r\n }\r\n\r\n /**\r\n * Returns the current SDK version.\r\n * \r\n * @returns SDK version\r\n */\r\n public async getSdkVersion(): Promise<string> {\r\n\r\n return Promise.resolve(version);\r\n }\r\n\r\n\r\n // ---\r\n // PRIVATE METHODS.\r\n // ---\r\n /** @ignore */\r\n private getClient(): Promise<IClient> {\r\n\r\n if (this.clientPromise) {\r\n\r\n return (this.clientPromise);\r\n }\r\n\r\n if (window.Client) {\r\n\r\n return (this.clientPromise = Promise.resolve(window.Client));\r\n }\r\n\r\n // A \"complete\" status indicates that the \"load\" event has been fired on the\r\n // window; and, that all sub-resources such as Scripts, Images, and Frames have\r\n // been loaded.\r\n if (window.document.readyState === \"complete\") {\r\n\r\n // If this event has fired AND the 3rd-party script isn't available (see IF-\r\n // condition BEFORE this one), it means that the 3rd-party script either\r\n // failed on the network or was BLOCKED by an ad-blocker. As such, we have to\r\n // fall-back to using a mock API.\r\n return (this.clientPromise = Promise.resolve(new NoopClient()));\r\n }\r\n\r\n // ASSERT: If we made it this far, the document has not completed loading (but it\r\n // may be in an \"interactive\" state which is when I believe that the Angular app\r\n // gets bootstrapped). As such, we need bind to the LOAD event to wait for our\r\n // third-party scripts to load (or fail to load, or be blocked).\r\n this.clientPromise = new Promise<IClient>(\r\n (resolve) => {\r\n\r\n window.addEventListener(\r\n \"load\",\r\n function handleWindowLoad() {\r\n\r\n // At this point, the 3rd-party library is either available or\r\n // it's not - there's no further loading to do. If it's not\r\n // present on the global scope, we're going to fall-back to using\r\n // a mock API.\r\n resolve(window.Client || new NoopClient());\r\n }\r\n );\r\n\r\n }\r\n );\r\n\r\n return (this.clientPromise);\r\n }\r\n}\r\n\r\n\r\n\r\n// ----------------------------------------------------------------------------------- //\r\n// ----------------------------------------------------------------------------------- //\r\n\r\n// I provide a mock API for the 3rd-party script. This just allows the consuming code to\r\n// act as though the library is available even if it failed to load (example, it was\r\n// blocked by an ad-blocker).\r\n\r\n/** @ignore */\r\nclass NoopClient implements IClient {\r\n\r\n constructor() {\r\n\r\n console.log(\r\n '%cClient API not available, falling back to mock API',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }\r\n\r\n public callback(...args: any[]): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public getDeviceTime(date?: Date): Promise<string> {\r\n\r\n return Promise.resolve(new Date().toISOString());\r\n }\r\n\r\n public async getDeviceTimeZoneName(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceTimeZoneID(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceTimeZoneOffset(): Promise<number> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getLanguageCode(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDeviceKey(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public sendCommand(name: string, arg: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string) {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public track(eventName: string, properties?: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public timeEvent(eventName: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public newEventSession(id?: string): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public async getRevelRoot(): Promise<string> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getCommandMap(): Promise<string> {\r\n\r\n return Promise.resolve('{}');\r\n }\r\n\r\n public finish(): void {\r\n\r\n // NOOP implement, nothing to do....\r\n }\r\n\r\n public async getDevice(): Promise<string | null> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getWidth(): Promise<number | null> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getHeight(): Promise<number | null> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getDuration(): Promise<number | null> {\r\n\r\n return Promise.resolve(null);\r\n }\r\n\r\n public async getSdkVersion(): Promise<string> {\r\n\r\n return Promise.resolve(version);\r\n }\r\n}\r\n","import { Injectable, enableProdMode, isDevMode } from '@angular/core';\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport * as yaml from \"js-yaml\";\r\nimport * as WebFont from 'webfontloader';\r\n\r\nconst isLocal: boolean = /localhost/.test(document.location.host);\r\n!isLocal && enableProdMode();\r\n\r\n\r\n/** @ignore */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppInitService {\r\n\r\n constructor(\r\n public http: HttpClient,\r\n private _route: ActivatedRoute,\r\n private _router: Router) {\r\n }\r\n\r\n init(): Promise<any> {\r\n\r\n return new Promise<void>(async (resolve) => {\r\n\r\n this.loadFonts();\r\n\r\n if (isDevMode()) {\r\n console.log(\r\n '%cRunning in development mode',\r\n 'background-color:blue; color:yellow;'\r\n );\r\n\r\n /**\r\n * Shim the shindig prefs functionality for dev mode\r\n */\r\n (<any>window).gadgets = {\r\n\r\n Prefs: class {\r\n getString(key: string) { return this.getParameterByName(key) }\r\n\r\n getArray(key: string) { return this.getParameterByName(key).split(',') }\r\n\r\n getBool(key: string) { return this.getParameterByName(key) === 'true' }\r\n\r\n getCountry() { }\r\n\r\n getFloat(key: string) { return parseFloat(this.getParameterByName(key)) }\r\n\r\n getInt(key: string) { return parseInt(this.getParameterByName(key)) }\r\n\r\n getLang() { return this.getParameterByName('lang') === '' ? 'en' : this.getParameterByName('lang'); }\r\n\r\n getParameterByName(name: string, search = window.location.href): string {\r\n\r\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\r\n let regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\r\n results = regex.exec(search);\r\n if (!results) return '';\r\n if (!results[2]) return '';\r\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\r\n }\r\n }\r\n };\r\n\r\n this.http.get('assets/gadget.yaml', {\r\n responseType: 'text'\r\n }).subscribe(data => {\r\n const doc: any = yaml.load(data);\r\n let params: any = {}\r\n for (const val of doc.prefs) {\r\n params[val.name] = val.default_value\r\n }\r\n\r\n this._router.navigate([], {\r\n relativeTo: this._route,\r\n queryParams: params,\r\n });\r\n\r\n console.log(\r\n `%cUser prefs loaded successfully`,\r\n 'background-color:blue; color:yellow;'\r\n );\r\n }, (err) => {\r\n console.log(\r\n `%cUnable to load user preferences YAML definition file: ${err}`,\r\n 'background-color:blue; color:yellow;'\r\n );\r\n console.log(\r\n `%cPlease see our developer documentation for help with your app configuration: https://developer.reveldigital.com`,\r\n 'background-color:red; color:yellow;'\r\n )\r\n })\r\n }\r\n resolve();\r\n });\r\n }\r\n\r\n\r\n private getFamilyName(css) {\r\n\r\n let FONT_FAMILY_REGEX = /font-family:\\s*(?:[&#39;&#34;])*['\"]*(.+?)['\"]*(?:[&#39;&#34;])*\\s*;/i;\r\n if (FONT_FAMILY_REGEX.test(css)) {\r\n var matches = css.match(FONT_FAMILY_REGEX);\r\n return matches[1].split(',')[0];\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n /**\r\n * Loads the given font from Google Web Fonts.\r\n */\r\n private loadFonts(): void {\r\n\r\n const parameters = new URLSearchParams(window.location.search);\r\n parameters.forEach((val, key) => {\r\n try {\r\n let fontFamily = this.getFamilyName(val);\r\n if (fontFamily !== '') {\r\n WebFont.load({\r\n google: {\r\n families: [fontFamily]\r\n },\r\n fontactive: (familyName) => {\r\n console.log(`%cActivating font: ${familyName}`,\r\n 'background-color:blue; color:yellow;');\r\n },\r\n fontinactive: (familyName) => {\r\n console.log(`%cFont inactive: ${familyName}`,\r\n 'background-color:red; color:yellow;');\r\n }\r\n });\r\n }\r\n } catch (e) {\r\n }\r\n });\r\n }\r\n}\r\n","import { Pipe, PipeTransform, NgModule } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n/**\r\n * The safe style pipe is used when custom styles are defined for a gadget and must be applied to an Angular\r\n * component. This pipe will ensure the style can be appied safely by utilizing the DomSanitizer.\r\n * \r\n * @example\r\n * <h2 [style]=\"style | safeStyle\">Sample Pref: {{ prefs.getString('myStringPref') }}</h2>\r\n */\r\n@Pipe({\r\n name: 'safeStyle',\r\n})\r\nexport class SafeStylePipe implements PipeTransform {\r\n constructor(private sanitized: DomSanitizer) { }\r\n\r\n transform(value: any): unknown {\r\n return this.sanitized.bypassSecurityTrustStyle(value);\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [SafeStylePipe],\r\n exports: [SafeStylePipe],\r\n})\r\nexport class NgSafeStylePipeModule { }\r\n","import { APP_INITIALIZER, LOCALE_ID, NgModule } from '@angular/core';\nimport { PlayerClientService } from './player-client.service';\nimport { AppInitService } from './app-init.service';\nimport { HttpClientModule } from '@angular/common/http';\nimport { RouterModule } from '@angular/router';\nimport { APP_BASE_HREF } from '@angular/common';\nimport { NgSafeStylePipeModule } from './safe-style.pipe';\n\ndeclare var gadgets: any;\n\n\n@NgModule({\n imports: [\n HttpClientModule,\n RouterModule.forRoot([]),\n NgSafeStylePipeModule\n ],\n exports: [\n NgSafeStylePipeModule\n ],\n providers: [{\n provide: APP_INITIALIZER,\n useFactory: initializeApp,\n deps: [AppInitService, PlayerClientService],\n multi: true\n },\n {\n provide: LOCALE_ID,\n useFactory: () => {\n try {\n return new gadgets.Prefs().getLang();\n } catch {\n return 'en';\n }\n }\n },\n { provide: APP_BASE_HREF, useValue: '/gadgets/ifr' }]\n})\nexport class PlayerClientModule { }\n\nfunction initializeApp(appInitService: AppInitService) {\n return async () => {\n PlayerClientService.init({});\n await appInitService.init();\n }\n}\n","/*\n * Public API Surface of player-client\n */\n\nexport * from './lib/player-client.service';\nexport * from './lib/player-client.module';\nexport * from './lib/safe-style.pipe';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,20 +1,155 @@
1
1
  /** @ignore */
2
2
  export interface IClient {
3
+ /**
4
+ * Callback to the player.
5
+ * This is the primary method of communication between the client and the player.
6
+ *
7
+ * @param {...any[]} args
8
+ * @returns {void}
9
+ * @memberof IClient
10
+ */
3
11
  callback(...args: any[]): void;
4
- getDeviceTime(date?: Date): Promise<string>;
5
- getDeviceTimeZoneName(): Promise<string>;
6
- getDeviceTimeZoneID(): Promise<string>;
7
- getDeviceTimeZoneOffset(): Promise<number>;
8
- getLanguageCode(): Promise<string>;
9
- getDeviceKey(): Promise<string>;
12
+ /**
13
+ * Get device name
14
+ *
15
+ * @returns {Promise<string | null>}
16
+ * @memberof IClient
17
+ */
18
+ getDeviceTime(date?: Date): Promise<string | null>;
19
+ /**
20
+ * Get device time zone name
21
+ *
22
+ * @returns {Promise<string | null>}
23
+ * @memberof IClient
24
+ */
25
+ getDeviceTimeZoneName(): Promise<string | null>;
26
+ /**
27
+ * Get device time zone ID
28
+ *
29
+ * @returns {Promise<string | null>}
30
+ * @memberof IClient
31
+ */
32
+ getDeviceTimeZoneID(): Promise<string | null>;
33
+ /**
34
+ * Get device time zone offset
35
+ *
36
+ * @returns {Promise<number | null>}
37
+ * @memberof IClient
38
+ */
39
+ getDeviceTimeZoneOffset(): Promise<number | null>;
40
+ /**
41
+ * Get device language code
42
+ *
43
+ * @returns {Promise<string | null>}
44
+ * @memberof IClient
45
+ */
46
+ getLanguageCode(): Promise<string | null>;
47
+ /**
48
+ * Get device key
49
+ *
50
+ * @returns {Promise<string | null>}
51
+ * @memberof IClient
52
+ */
53
+ getDeviceKey(): Promise<string | null>;
54
+ /**
55
+ * Send command to device
56
+ *
57
+ * @param name
58
+ * @param arg
59
+ * @returns {void}
60
+ * @memberof IClient
61
+ */
10
62
  sendCommand(name: string, arg: string): void;
63
+ /**
64
+ * Send remote command to device
65
+ *
66
+ * @param deviceKeys
67
+ * @param name
68
+ * @param arg
69
+ * @returns {void}
70
+ * @memberof IClient
71
+ */
11
72
  sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void;
73
+ /**
74
+ * Track event
75
+ *
76
+ * In the case of a timed event, the duration is calculated from the timeEvent call to the track call.
77
+ *
78
+ * @param eventName
79
+ * @param properties
80
+ * @returns {void}
81
+ * @memberof IClient
82
+ */
12
83
  track(eventName: string, properties?: string): void;
84
+ /**
85
+ * Start tracking of event with duration
86
+ *
87
+ * @param eventName
88
+ * @returns {void}
89
+ * @memberof IClient
90
+ */
13
91
  timeEvent(eventName: string): void;
92
+ /**
93
+ * Start a new session
94
+ *
95
+ * @param id optional session ID
96
+ * @returns {void}
97
+ * @memberof IClient
98
+ */
14
99
  newEventSession(id?: string): void;
15
- getRevelRoot(): Promise<string>;
16
- getCommandMap(): Promise<string>;
17
- getDevice(): Promise<string>;
100
+ /**
101
+ * Get the root directory of the Revel system
102
+ *
103
+ * @returns {Promise<string | null>}
104
+ * @memberof IClient
105
+ */
106
+ getRevelRoot(): Promise<string | null>;
107
+ /**
108
+ * Get the command map
109
+ *
110
+ * @returns {Promise<string | null>}
111
+ * @memberof IClient
112
+ */
113
+ getCommandMap(): Promise<string | null>;
114
+ /**
115
+ * Signals to the player that the client is finished and the player can transition to the next source
116
+ */
18
117
  finish(): void;
118
+ /**
119
+ * Get device information
120
+ *
121
+ * @returns {Promise<string | null>}
122
+ * @memberof IClient
123
+ */
124
+ getDevice(): Promise<string | null>;
125
+ /**
126
+ * Get width of the visualization area
127
+ *
128
+ * @returns {Promise<number | null>}
129
+ * @memberof IClient
130
+ */
131
+ getWidth(): Promise<number | null>;
132
+ /**
133
+ * Get height of the visualization area
134
+ *
135
+ * @returns {Promise<number | null>}
136
+ * @memberof IClient
137
+ */
138
+ getHeight(): Promise<number | null>;
139
+ /**
140
+ * Get the duration of the currently playing source
141
+ * (only applicable when associated with a playlist)
142
+ *
143
+ * @returns {Promise<number | null>}
144
+ * @memberof IClient
145
+ */
146
+ getDuration(): Promise<number | null>;
147
+ /**
148
+ * Get the SDK version
149
+ *
150
+ * @returns {Promise<string | null>}
151
+ * @memberof IClient
152
+ */
153
+ getSdkVersion(): Promise<string | null>;
19
154
  }
20
155
  //# sourceMappingURL=client.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.interface.d.ts","sourceRoot":"","sources":["../../../../../projects/reveldigital/player-client/src/lib/interfaces/client.interface.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,MAAM,WAAW,OAAO;IAEpB,QAAQ,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAE/B,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5C,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzC,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvC,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3C,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7C,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpD,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,eAAe,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEjC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7B,MAAM,IAAI,IAAI,CAAC;CAClB"}
1
+ {"version":3,"file":"client.interface.d.ts","sourceRoot":"","sources":["../../../../../projects/reveldigital/player-client/src/lib/interfaces/client.interface.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,MAAM,WAAW,OAAO;IAEpB;;;;;;;OAOG;IACH,QAAQ,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAE/B;;;;;OAKG;IACH,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEnD;;;;;OAKG;IACH,qBAAqB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEhD;;;;;OAKG;IACH,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE9C;;;;;OAKG;IACH,uBAAuB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAElD;;;;;OAKG;IACH,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE1C;;;;;OAKG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEvC;;;;;;;OAOG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7C;;;;;;;;OAQG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzE;;;;;;;;;OASG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpD;;;;;;OAMG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC;;;;;OAKG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEvC;;;;;OAKG;IACH,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAExC;;OAEG;IACH,MAAM,IAAI,IAAI,CAAC;IAEf;;;;;OAKG;IACH,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEpC;;;;;OAKG;IACH,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEnC;;;;;OAKG;IACH,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEpC;;;;;;OAMG;IACH,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEtC;;;;;OAKG;IACH,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC3C"}
@@ -181,6 +181,31 @@ export declare class PlayerClientService implements OnDestroy {
181
181
  * @returns Device details.
182
182
  */
183
183
  getDevice(): Promise<IDevice | null>;
184
+ /**
185
+ * Returns the width of the visualization area.
186
+ *
187
+ * @returns Width of the visualization area
188
+ */
189
+ getWidth(): Promise<number | null>;
190
+ /**
191
+ * Returns the height of the visualization area.
192
+ *
193
+ * @returns Height of the visualization area
194
+ */
195
+ getHeight(): Promise<number | null>;
196
+ /**
197
+ * Returns the duration of the currently playing source.
198
+ * (only applicable when associated with a playlist)
199
+ *
200
+ * @returns Duration of the current item in milliseconds
201
+ */
202
+ getDuration(): Promise<number | null>;
203
+ /**
204
+ * Returns the current SDK version.
205
+ *
206
+ * @returns SDK version
207
+ */
208
+ getSdkVersion(): Promise<string>;
184
209
  /** @ignore */
185
210
  private getClient;
186
211
  static ɵfac: i0.ɵɵFactoryDeclaration<PlayerClientService, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"player-client.service.d.ts","sourceRoot":"","sources":["../../../../projects/reveldigital/player-client/src/lib/player-client.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,eAAe,EAAa,OAAO,EAAgB,MAAM,MAAM,CAAC;AAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;;AAQxD,cAAc;AACd,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,MAAM,EAAE,OAAO,CAAC;CACrB;AAED,qBAGa,mBAAoB,YAAW,SAAS;IAEnD,cAAc;IACd,OAAO,CAAC,aAAa,CAA0B;IAE/C;;OAEG;IACI,UAAU,oBAA2B;IAC5C;;OAEG;IACI,QAAQ,2BAA8B;IAC7C;;OAEG;IACI,QAAQ,mBAAiB;IAChC;;OAEG;IACI,OAAO,mBAAiB;IAQ/B,cAAc;IACd,OAAO,CAAC,UAAU,CAAe;IACjC,cAAc;IACd,OAAO,CAAC,WAAW,CAGjB;IACF,cAAc;IACd,OAAO,CAAC,SAAS,CAAe;IAChC,cAAc;IACd,OAAO,CAAC,UAAU,CAGhB;IACF,cAAc;IACd,OAAO,CAAC,YAAY,CAAe;IACnC,cAAc;IACd,OAAO,CAAC,aAAa,CAInB;IAaF,cAAc;gBACF,IAAI,EAAE,MAAM;IAgCxB,cAAc;IACd,WAAW,IAAI,IAAI;IASnB,cAAc;WACA,IAAI,CAAC,IAAI,EAAE,GAAG;IAQ5B;;;;;;;;;OASG;IACI,QAAQ,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IA2BrC;;;;;;;;;;;OAWG;IACI,QAAQ,IAAI,OAAO,CAAC,KAAK;IAKhC;;;;;;OAMG;IACU,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAUxD;;;;OAIG;IACU,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAOrD;;;;OAIG;IACU,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IAOnD;;;;OAIG;IACU,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC;IAOvD;;;;OAIG;IACU,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAO/C;;;;OAIG;IACU,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAO5C;;;;;OAKG;IACI,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAOnD;;;;;;;OAOG;IACI,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAO/E;;;;;;OAMG;IACI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAOpE;;;;;;;;OAQG;IACI,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOzC;;;;;;OAMG;IACI,eAAe,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAWzC;;;;OAIG;IACU,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAO5C;;;;OAIG;IACU,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1C;;;OAGG;IACI,MAAM,IAAI,IAAI;IAQrB;;;;;OAKG;IACU,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAO9C;;;;KAIC;IACY,SAAS,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAiCjD,cAAc;IACd,OAAO,CAAC,SAAS;yCAzZN,mBAAmB;6CAAnB,mBAAmB;CA0c/B"}
1
+ {"version":3,"file":"player-client.service.d.ts","sourceRoot":"","sources":["../../../../projects/reveldigital/player-client/src/lib/player-client.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,eAAe,EAAa,OAAO,EAAgB,MAAM,MAAM,CAAC;AAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;;AAUxD,cAAc;AACd,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,MAAM,EAAE,OAAO,CAAC;CACrB;AAED,qBAGa,mBAAoB,YAAW,SAAS;IAEnD,cAAc;IACd,OAAO,CAAC,aAAa,CAA0B;IAE/C;;OAEG;IACI,UAAU,oBAA2B;IAC5C;;OAEG;IACI,QAAQ,2BAA8B;IAC7C;;OAEG;IACI,QAAQ,mBAAiB;IAChC;;OAEG;IACI,OAAO,mBAAiB;IAQ/B,cAAc;IACd,OAAO,CAAC,UAAU,CAAe;IACjC,cAAc;IACd,OAAO,CAAC,WAAW,CAGjB;IACF,cAAc;IACd,OAAO,CAAC,SAAS,CAAe;IAChC,cAAc;IACd,OAAO,CAAC,UAAU,CAGhB;IACF,cAAc;IACd,OAAO,CAAC,YAAY,CAAe;IACnC,cAAc;IACd,OAAO,CAAC,aAAa,CAInB;IAaF,cAAc;gBACF,IAAI,EAAE,MAAM;IAgCxB,cAAc;IACd,WAAW,IAAI,IAAI;IASnB,cAAc;WACA,IAAI,CAAC,IAAI,EAAE,GAAG;IAQ5B;;;;;;;;;OASG;IACI,QAAQ,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IA2BrC;;;;;;;;;;;OAWG;IACI,QAAQ,IAAI,OAAO,CAAC,KAAK;IAKhC;;;;;;OAMG;IACU,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAUxD;;;;OAIG;IACU,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAOrD;;;;OAIG;IACU,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IAOnD;;;;OAIG;IACU,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC;IAOvD;;;;OAIG;IACU,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAO/C;;;;OAIG;IACU,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAO5C;;;;;OAKG;IACI,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAOnD;;;;;;;OAOG;IACI,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAO/E;;;;;;OAMG;IACI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAOpE;;;;;;;;OAQG;IACI,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOzC;;;;;;OAMG;IACI,eAAe,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAWzC;;;;OAIG;IACU,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAO5C;;;;OAIG;IACU,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1C;;;OAGG;IACI,MAAM,IAAI,IAAI;IAQrB;;;;;OAKG;IACU,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAO9C;;;;KAIC;IACY,SAAS,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA8BjD;;;;OAIG;IACU,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAO/C;;;;OAIG;IACU,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOhD;;;;;OAKG;IACU,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOlD;;;;OAIG;IACU,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAS7C,cAAc;IACd,OAAO,CAAC,SAAS;yCAzcN,mBAAmB;6CAAnB,mBAAmB;CAyf/B"}
@@ -0,0 +1,2 @@
1
+ export declare const version = "1.0.10";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../../projects/reveldigital/player-client/src/lib/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,WAAW,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reveldigital/player-client",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "description": "Helper library for interfacing Angular apps with the Revel Digital player",
5
5
  "schematics": "./schematics/collection.json",
6
6
  "ng-add": {