@reveldigital/player-client 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -286,6 +286,36 @@ export class PlayerClientService {
286
286
  const client = await this.getClient();
287
287
  return client instanceof NoopClient;
288
288
  }
289
+ /**
290
+ * Returns the device details associated with the player running the gadget or web app.
291
+ *
292
+ * @returns Device details.
293
+ */
294
+ async getDevice() {
295
+ const client = await this.getClient();
296
+ let obj = JSON.parse(await client.getDevice());
297
+ const device = [obj].map((device) => {
298
+ return {
299
+ name: device.name,
300
+ registrationKey: device.key,
301
+ deviceType: device.devicetype,
302
+ enteredService: new Date(device.enteredservice),
303
+ langCode: device.langcode,
304
+ timeZone: device.timezone,
305
+ tags: device.description?.split('\n'),
306
+ location: {
307
+ city: device.location?.city,
308
+ state: device.location?.state,
309
+ country: device.location?.country,
310
+ postalCode: device.location?.postalcode,
311
+ address: device.location?.address,
312
+ latitude: device.location?.latitude,
313
+ longitude: device.location?.longitude
314
+ }
315
+ };
316
+ });
317
+ return device[0];
318
+ }
289
319
  // ---
290
320
  // PRIVATE METHODS.
291
321
  // ---
@@ -383,8 +413,11 @@ class NoopClient {
383
413
  async getCommandMap() {
384
414
  return Promise.resolve('{}');
385
415
  }
416
+ async getDevice() {
417
+ return Promise.resolve(null);
418
+ }
386
419
  finish() {
387
420
  // NOOP implement, nothing to do....
388
421
  }
389
422
  }
390
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLWNsaWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmV2ZWxkaWdpdGFsL3BsYXllci1jbGllbnQvc3JjL2xpYi9wbGF5ZXItY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUE0RGpELE1BQU0sT0FBTyxtQkFBbUI7SUFtRDlCLDBDQUEwQztJQUMxQyxpRUFBaUU7SUFDakUsMkNBQTJDO0lBQzNDLCtDQUErQztJQUMvQywrQ0FBK0M7SUFDL0Msc0RBQXNEO0lBQ3RELHdFQUF3RTtJQUN4RSxhQUFhO0lBQ2IseUJBQXlCO0lBQ3pCLEtBQUs7SUFFTCxjQUFjO0lBQ2QsWUFBWSxJQUFZO1FBMUR4Qjs7V0FFRztRQUNJLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQzNDOztXQUVHO1FBQ0ksYUFBUSxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDOztXQUVHO1FBQ0ksYUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDaEM7O1dBRUc7UUFDSSxZQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVUvQixjQUFjO1FBQ04sZ0JBQVcsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUNsRSxLQUFLLEVBQUUsRUFDUCxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUNuQixDQUFDO1FBR0YsY0FBYztRQUNOLGVBQVUsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFF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Q0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWU7UUFFMUIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWTtRQUV2QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLFdBQVcsQ0FBQyxJQUFZLEVBQUUsR0FBVztRQUUxQyxvQ0FBb0M7SUFDdEMsQ0FBQztJQUVNLGlCQUFpQixDQUFDLFVBQW9CLEVBQUUsSUFBWSxFQUFFLEdBQVc7UUFFdEUsb0NBQW9DO0lBQ3RDLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBaUIsRUFBRSxVQUFtQjtRQUVqRCxvQ0FBb0M7SUFDdEMsQ0FBQztJQUVNLFNBQVMsQ0FBQyxTQUFpQjtRQUVoQyxvQ0FBb0M7SUFDdEMsQ0FBQztJQUVNLGVBQWUsQ0FBQyxFQUFXO1FBRWhDLG9DQUFvQztJQUN0QyxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVk7UUFFdkIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYTtRQUV4QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU07UUFFWCxvQ0FBb0M7SUFDdEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmcm9tRXZlbnQsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHNoYXJlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IGdhZGdldHMgfSBmcm9tICdAcmV2ZWxkaWdpdGFsL2dhZGdldC10eXBlcyc7XHJcblxyXG5cclxuLy8gU28gdGhhdCBUeXBlU2NyaXB0IGRvZXNuJ3QgY29tcGxhaW4sIHdlJ3JlIGdvaW5nIHRvIGF1Z21lbnQgdGhlIEdMT0JBTCAvIFdJTkRPVyBcclxuLy8gbmFtZS1zcGFjZSBkZWZpbml0aW9uIHRvIGluY2x1ZGUgdGhlIFRyYWNrZXIgQVBJLiBUaGlzIGFsc28gcHJvdmlkZXMgdXMgd2l0aCBhIHBsYWNlXHJcbi8vIHRvIGFjdHVhbGx5IERPQ1VNRU5UIHRoZSBBUEkgc28gdGhhdCBvdXIgZGV2ZWxvcGVycyBhcmVuJ3QgZ3Vlc3NpbmcgYWJvdXQgd2hhdCdzXHJcbi8vIGF2YWlsYWJsZSBvbiB0aGUgbGlicmFyeS5cclxuXHJcbi8qKiBAaWdub3JlICovXHJcbmRlY2xhcmUgZ2xvYmFsIHtcclxuICB2YXIgQ2xpZW50OiBDbGllbnQ7XHJcbn1cclxuXHJcbi8qKiBAaWdub3JlICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50IHtcclxuXHJcbiAgY2FsbGJhY2soLi4uYXJnczogYW55W10pOiB2b2lkO1xyXG5cclxuICBnZXREZXZpY2VUaW1lKGRhdGU/OiBEYXRlKTogUHJvbWlzZTxzdHJpbmc+O1xyXG5cclxuICBnZXREZXZpY2VUaW1lWm9uZU5hbWUoKTogUHJvbWlzZTxzdHJpbmc+O1xyXG5cclxuICBnZXREZXZpY2VUaW1lWm9uZUlEKCk6IFByb21pc2U8c3RyaW5nPjtcclxuXHJcbiAgZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTogUHJvbWlzZTxudW1iZXI+O1xyXG5cclxuICBnZXRMYW5ndWFnZUNvZGUoKTogUHJvbWlzZTxzdHJpbmc+O1xyXG5cclxuICBnZXREZXZpY2VLZXkoKTogUHJvbWlzZTxzdHJpbmc+O1xyXG5cclxuICBzZW5kQ29tbWFuZChuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZDtcclxuXHJcbiAgc2VuZFJlbW90ZUNvbW1hbmQoZGV2aWNlS2V5czogc3RyaW5nW10sIG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpOiB2b2lkO1xyXG5cclxuICB0cmFjayhldmVudE5hbWU6IHN0cmluZywgcHJvcGVydGllcz86IHN0cmluZyk6IHZvaWQ7XHJcblxyXG4gIHRpbWVFdmVudChldmVudE5hbWU6IHN0cmluZyk6IHZvaWQ7XHJcblxyXG4gIG5ld0V2ZW50U2Vzc2lvbihpZD86IHN0cmluZyk6IHZvaWQ7XHJcblxyXG4gIGdldFJldmVsUm9vdCgpOiBQcm9taXNlPHN0cmluZz47XHJcblxyXG4gIGdldENvbW1hbmRNYXAoKTogUHJvbWlzZTxzdHJpbmc+O1xyXG5cclxuICBmaW5pc2goKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFdmVudFByb3BlcnRpZXMge1xyXG4gIFtrZXk6IHN0cmluZ106IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgYXJnOiBzdHJpbmc7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFBsYXllckNsaWVudFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgY2xpZW50UHJvbWlzZTogUHJvbWlzZTxDbGllbnQ+IHwgbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29tbWFuZHMgc2VudCB0byB0aGlzIHBsYXllci5cclxuICAgKi9cclxuICBwdWJsaWMgb25Db21tYW5kJCA9IG5ldyBTdWJqZWN0PENvbW1hbmQ+KCk7XHJcbiAgLyoqXHJcbiAgICogU2lnbmFscyB0aGUgZ2FkZ2V0IGhhcyBiZWVuIGxvYWRlZCBhbmQgaXMgcmVhZHkgdG8gc3RhcnQuXHJcbiAgICovXHJcbiAgcHVibGljIG9uUmVhZHkkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XHJcbiAgLyoqXHJcbiAgICogU2lnbmFscyB0aGUgZ2FkZ2V0IGhhcyBiZWVuIHN0YXJ0ZWQgYnkgdGhlIHBsYXllci5cclxuICAgKi9cclxuICBwdWJsaWMgb25TdGFydCQgPSBuZXcgU3ViamVjdCgpO1xyXG4gIC8qKlxyXG4gICAqIFNpZ25hbHMgdGhlIGdhZGdldHMgaGFzIGJlZW4gc3RvcHBlZCBieSB0aGUgcGxheWVyLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvblN0b3AkID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgLy9cclxuICAvLyBUd28gbWV0aG9kcyBhdmFpbGFibGUgZm9yIGNhbGxpbmcgaW50byB0aGUgbGlicmFyeTpcclxuICAvL1xyXG4gIC8vIDEpIFVzaW5nIGRpc3BhdGNoRXZlbnQoKSB3aXRoIHRoZSBmb2xsb3dpbmcgY3VzdG9tIGV2ZW50c1xyXG4gIC8vIDIpIFVzaW5nIHRoZSB3aW5kb3cgc2NvcGVkIFJldmVsRGlnaXRhbCBvYmplY3QgYXMgZGVmaW5lZCBpbiB0aGUgY29uc3RydWN0b3JcclxuICAvL1xyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBvblN0YXJ0U3ViOiBTdWJzY3JpcHRpb247XHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIG9uU3RhcnRFdnQkID0gZnJvbUV2ZW50KGRvY3VtZW50LCAnUmV2ZWxEaWdpdGFsLlN0YXJ0JykucGlwZShcclxuICAgIHNoYXJlKCksXHJcbiAgICB0YXAodGhpcy5vblN0YXJ0JClcclxuICApO1xyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBvblN0b3BTdWI6IFN1YnNjcmlwdGlvbjtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgb25TdG9wRXZ0JCA9IGZyb21FdmVudChkb2N1bWVudCwgJ1JldmVsRGlnaXRhbC5TdG9wJykucGlwZShcclxuICAgIHNoYXJlKCksXHJcbiAgICB0YXAodGhpcy5vblN0b3AkKVxyXG4gICk7XHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIG9uQ29tbWFuZFN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBvbkNvbW1hbmRFdnQkID0gZnJvbUV2ZW50PENvbW1hbmQ+KGRvY3VtZW50LCAnUmV2ZWxEaWdpdGFsLkNvbW1hbmQnKS5waXBlKFxyXG4gICAgbWFwKChlOiBhbnkpID0+IHsgcmV0dXJuIHsgbmFtZTogZS5kZXRhaWwubmFtZSwgYXJnOiBlLmRldGFpbC5hcmcgfSBhcyBDb21tYW5kIH0pLFxyXG4gICAgc2hhcmUoKSxcclxuICAgIHRhcCh0aGlzLm9uQ29tbWFuZCQpXHJcbiAgKTtcclxuXHJcbiAgLy8gcHJpdmF0ZSBvblBvc3RNZXNzYWdlU3ViOiBTdWJzY3JpcHRpb247XHJcbiAgLy8gcHJpdmF0ZSBvblBvc3RNZXNzYWdlRXZ0JCA9IGZyb21FdmVudCh3aW5kb3csICdtZXNzYWdlJykucGlwZShcclxuICAvLyAgIGZpbHRlcigobWVzc2FnZUV2ZW50OiBNZXNzYWdlRXZlbnQpID0+XHJcbiAgLy8gICAgIG1lc3NhZ2VFdmVudC5zb3VyY2UgIT09IHdpbmRvdy5wYXJlbnQgJiZcclxuICAvLyAgICAgdHlwZW9mIG1lc3NhZ2VFdmVudC5kYXRhID09PSAnc3RyaW5nJyAmJlxyXG4gIC8vICAgICBtZXNzYWdlRXZlbnQuZGF0YS5zdGFydHNXaXRoKCdyZXZlbGRpZ2l0YWw6JykpLFxyXG4gIC8vICAgbWFwKChlOiBhbnkpID0+IHsgcmV0dXJuIEpTT04ucGFyc2UoZS5zdWJzdHJpbmcoMTMpKSBhcyBDb21tYW5kIH0pLFxyXG4gIC8vICAgc2hhcmUoKSxcclxuICAvLyAgIHRhcCh0aGlzLm9uQ29tbWFuZCQpXHJcbiAgLy8gKTtcclxuXHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBjb25zdHJ1Y3Rvcih6b25lOiBOZ1pvbmUpIHtcclxuXHJcbiAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAod2luZG93IGFzIGFueSkuUmV2ZWxEaWdpdGFsID0ge1xyXG4gICAgICBDb250cm9sbGVyOiB7XHJcbiAgICAgICAgb25Db21tYW5kOiBmdW5jdGlvbiAobmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZykge1xyXG4gICAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBzZWxmLm9uQ29tbWFuZCQubmV4dCh7IG5hbWU6IG5hbWUsIGFyZzogYXJnIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblN0YXJ0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICB6b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlbGYub25TdGFydCQubmV4dChudWxsKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25TdG9wOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICB6b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlbGYub25TdG9wJC5uZXh0KG51bGwpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vblN0YXJ0U3ViID0gdGhpcy5vblN0YXJ0RXZ0JC5zdWJzY3JpYmUoKCkgPT4geyB9KTtcclxuICAgIHRoaXMub25TdG9wU3ViID0gdGhpcy5vblN0b3BFdnQkLnN1YnNjcmliZSgoKSA9PiB7IH0pO1xyXG4gICAgdGhpcy5vbkNvbW1hbmRTdWIgPSB0aGlzLm9uQ29tbWFuZEV2dCQuc3Vic2NyaWJlKCgpID0+IHsgfSk7XHJcblxyXG4gICAgdGhpcy5jbGllbnRQcm9taXNlID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLm9uUmVhZHkkLm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMub25TdGFydFN1Yj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMub25TdG9wU3ViPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5vbkNvbW1hbmRTdWI/LnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5vblJlYWR5JC5uZXh0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHVibGljIHN0YXRpYyBpbml0KGRhdGE6IGFueSkge1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAnJWPimpnvuI8gSW5pdGlhbGl6aW5nIFJldmVsIERpZ2l0YWwgY2xpZW50IGxpYnJhcnknLFxyXG4gICAgICAnYmFja2dyb3VuZC1jb2xvcjpibHVlOyBjb2xvcjp5ZWxsb3c7J1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0aGUgZ2FkZ2V0IHRvIGNvbW11bmljYXRlIHdpdGggcGxheWVyIHNjcmlwdGluZy5cclxuICAgKiBJZiB0aGUgYXBwcm9wcmlhdGUgc2NyaXB0aW5nIGlzIGluIHBsYWNlIGluIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZW1wbGF0ZSwgY2FsbGluZyB0aGlzIG1ldGhvZFxyXG4gICAqIHdpbGwgaW5pdGlhdGUgYSBjYWxsYmFjayB3aGljaCBjYW4gYmUgYWN0ZWQgdXBvbiBpbiBwbGF5ZXIgc2NyaXB0LlxyXG4gICAqIFxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogY2xpZW50LmNhbGxiYWNrKCd0ZXN0JywgJ3RoaXMnKTtcclxuICAgKiBcclxuICAgKiBAcGFyYW0gYXJncyB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzXHJcbiAgICovXHJcbiAgcHVibGljIGNhbGxiYWNrKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcclxuXHJcbiAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgIGNsaWVudC5jYWxsYmFjayhhcmdzWzBdKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgIGNsaWVudC5jYWxsYmFjayhhcmdzWzFdKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgIGNsaWVudC5jYWxsYmFjayhhcmdzWzJdKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgIGNsaWVudC5jYWxsYmFjayhhcmdzWzNdKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgNTpcclxuICAgICAgICAgIGNsaWVudC5jYWxsYmFjayhhcmdzWzRdKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWNjZXNzb3IgbWV0aG9kIGZvciB0aGUgdXNlciBwcmVmZXJlbmNlcyBpbnRlcmZhY2UgZXhwb3NlZCBieSB0aGUgR2FkZ2V0cyBBUEkuXHJcbiAgICogXHJcbiAgICogU2VlIHtAbGluayBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9nYWRnZXRzL2RvY3MvYmFzaWN9IGZvciBtb3JlIGRldGFpbHMgb24gdGhlIEdhZGdldHMgQVBJLlxyXG4gICAqIFxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogY29uc3RydWN0b3IocHVibGljIGNsaWVudDogUGxheWVyQ2xpZW50U2VydmljZSkge1xyXG4gICAqICAgICAgICAgICAgbGV0IHByZWZzID0gY2xpZW50LmdldFByZWZzKCk7XHJcbiAgICogICAgICAgICAgICBsZXQgbXlTdHJpbmcgPSBwcmVmcy5nZXRTdHJpbmcoJ215U3RyaW5nUHJlZicpO1xyXG4gICAqIH1cclxuICAgKiBAcmV0dXJucyB7Z2FkZ2V0cy5QcmVmc30gR2FkZ2V0IEFQSSBQcmVmcyBvYmplY3RcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0UHJlZnMoKTogZ2FkZ2V0cy5QcmVmcyB7XHJcblxyXG4gICAgcmV0dXJuIG5ldyB3aW5kb3dbJ2dhZGdldHMnXVsnUHJlZnMnXSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBkZXZpY2UgdGltZSBpbiBJU084NjAxIGZvcm1hdC5cclxuICAgKiBDdXJyZW50IGRldmljZSB0aW1lIGlzIGRldGVybWluZWQgYnkgdGhlIGRldmljZSB0aW1lem9uZSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlIGluIHRoZSBDTVMuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGRhdGUgT3B0aW9uYWwuIElmIHN1cHBsaWVkIHdpbGwgdHJhbnNsYXRlIHRoZSBzdXBwbGllZCBkYXRlL3RpbWUgdG8gZGV2aWNlIHRpbWUgYmFzZWQgb24gcmVzcGVjdGl2ZSB0aW1lem9uZXMuXHJcbiAgICogQHJldHVybnMgRGF0ZS90aW1lIGluIElTTzg2MDEgZm9ybWF0XHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWUoZGF0ZT86IERhdGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgaWYgKGRhdGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gY2xpZW50LmdldERldmljZVRpbWUoZGF0ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xpZW50LmdldERldmljZVRpbWUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHRpbWV6b25lIG5hbWUgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBkZXZpY2UuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgVGltZXpvbmUgTmFtZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lWm9uZU5hbWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZVpvbmVOYW1lKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSB0aW1lem9uZSBJRCBjdXJyZW50bHkgYXNzaWduZWQgdG8gdGhlIGRldmljZS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBUaW1lem9uZSBJRFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lWm9uZUlEKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gY2xpZW50LmdldERldmljZVRpbWVab25lSUQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG51bWVyaWNhbCBvZmZzZXQgZnJvbSBHTVQgb2YgdGhlIHRpbWV6b25lIGN1cnJlbnRseSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFRpbWV6b25lIG9mZnNldFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lWm9uZU9mZnNldCgpOiBQcm9taXNlPG51bWJlcj4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lWm9uZU9mZnNldCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbGFuZ3VhZ2UgY29kZSBvZiB0aGUgbGFuZ3VhZ2UgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBkZXZpY2UuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgTGFuZ3VhZ2UgY29kZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXRMYW5ndWFnZUNvZGUoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIHJldHVybiBjbGllbnQuZ2V0TGFuZ3VhZ2VDb2RlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSB1bmlxdWUgUmV2ZWwgRGlnaXRhbCBkZXZpY2Uga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIERldmljZSBrZXlcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlS2V5KCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gY2xpZW50LmdldERldmljZUtleSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBhIGNvbW1hbmQgdG8gdGhlIHBsYXllciBkZXZpY2UuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIG5hbWUgQ29tbWFuZCBuYW1lXHJcbiAgICogQHBhcmFtIGFyZyBDb21tYW5kIGFyZ3VtZW50XHJcbiAgICovXHJcbiAgcHVibGljIHNlbmRDb21tYW5kKG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xyXG4gICAgICBjbGllbnQuc2VuZENvbW1hbmQobmFtZSwgYXJnKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kIGEgY29tbWFuZCB0byBhbnkgcmVtb3RlIHBsYXllciB3aXRoIHRoZSBzdXBwbGllZCBkZXZpY2Uga2V5KHMpLlxyXG4gICAqIE5vdGU6IFJlbW90ZSBjb21tYW5kcyBjYW4gb25seSBiZSBkZWxpdmVyZWQgdG8gZGV2aWNlcyB3aXRoaW4gdGhlIHNhbWUgYWNjb3VudCBhcyB0aGUgc2VuZGVyIGRldmljZS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gZGV2aWNlS2V5cyBBcnJheSBvZiByZW1vdGUgZGV2aWNlIGtleXNcclxuICAgKiBAcGFyYW0gbmFtZSBDb21tYW5kIG5hbWVcclxuICAgKiBAcGFyYW0gYXJnIENvbW1hbmQgYXJnXHJcbiAgICovXHJcbiAgcHVibGljIHNlbmRSZW1vdGVDb21tYW5kKGRldmljZUtleXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcclxuICAgICAgY2xpZW50LnNlbmRSZW1vdGVDb21tYW5kKGRldmljZUtleXMsIG5hbWUsIGFyZyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvZyBhbiBldmVudCBmb3IgdXNlIHdpdGggQWRIYXdrIGFuYWx5dGljcy5cclxuICAgKiBFdmVudHMgYXJlIHVzZWQgZm9yIHRyYWNraW5nIHZhcmlvdXMgbWV0cmljcyBpbmNsdWRpbmcgdXNhZ2Ugc3RhdGlzdGljcywgcGxheWVyIGNvbmRpdGlvbiwgc3RhdGUgY2hhbmdlcywgZXRjLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBldmVudE5hbWUgVW5pcXVlIG5hbWUgZm9yIHRoaXMgZXZlbnRcclxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBBIG1hcCBvZiB1c2VyIGRlZmluZWQgcHJvcGVydGllcyB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGV2ZW50XHJcbiAgICovXHJcbiAgcHVibGljIHRyYWNrKGV2ZW50TmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzPzogRXZlbnRQcm9wZXJ0aWVzKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcclxuICAgICAgY2xpZW50LnRyYWNrKGV2ZW50TmFtZSwgSlNPTi5zdHJpbmdpZnkocHJvcGVydGllcykpO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldGhvZCBmb3IgaW5pdGlhdGluZyBhIHRpbWVkIGV2ZW50LlxyXG4gICAqIFRpbWVkIGV2ZW50cyBhcmUgdXNlZnVsIGZvciB0cmFja2luZyB0aGUgZHVyYXRpb24gb2YgYW4gZXZlbnQgYW5kIG11c3QgYmUgcHJvY2VlZGVkIHdpdGggYSBjYWxsIHRvIHRyYWNrKCkuXHJcbiAgICogXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBjbGllbnQudGltZUV2ZW50KCd0ZXN0RXZlbnQnKTtcclxuICAgKiBjbGllbnQudHJhY2soXCJ0ZXN0XCIsIHsgXCJhXCI6IFwiYlwiIH0pO1xyXG4gICAqIEBwYXJhbSBldmVudE5hbWUgVW5pcXVlIG5hbWUgZm9yIHRoaXMgZXZlbnRcclxuICAgKi9cclxuICBwdWJsaWMgdGltZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcclxuICAgICAgY2xpZW50LnRpbWVFdmVudChldmVudE5hbWUpO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgc2Vzc2lvbiBpcyBhIHdheSBvZiBncm91cGluZyBldmVudHMgdG9nZXRoZXIuIEVhY2ggZXZlbnQgaGFzIGFuIGFzc29jaWF0ZWQgc2Vzc2lvbiBJRC5cclxuICAgKiBTZXNzaW9uIElEJ3MgYXJlIHJhbmRvbWx5IGdlbmVyYXRlZCBhbmQgcmVzZXQgYnkgc3Vic2VxdWVudCBjYWxscyB0byBuZXdFdmVudFNlc3Npb24oKS5cclxuICAgKiBcclxuICAgKiBFYWNoIGNhbGwgdG8gdHJhY2soKSB3aWxsIHV0aWxpemUgdGhlIHNhbWUgc2Vzc2lvbiBJRCwgdW50aWwgYW5vdGhlciBjYWxsIHRvIG5ld0V2ZW50U2Vzc2lvbigpLlxyXG4gICAqIEBwYXJhbSBpZCBPcHRpb25hbC4gVXNlciBzdXBwbGllZCBzZXNzaW9uIElELiBJZiBub3Qgc3VwcGxpZWQgYSByYW5kb20gc2Vzc2lvbiBJRCB3aWxsIGJlIGdlbmVyYXRlZC5cclxuICAgKi9cclxuICBwdWJsaWMgbmV3RXZlbnRTZXNzaW9uKGlkPzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcclxuICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjbGllbnQubmV3RXZlbnRTZXNzaW9uKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2xpZW50Lm5ld0V2ZW50U2Vzc2lvbihpZCk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSByb290IGZvbGRlciB1dGlsaXplZCBieSB0aGlzIHBsYXllciBkZXZpY2UuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgUGF0aCB0byB0aGUgcm9vdCBmb2xkZXJcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0UmV2ZWxSb290KCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gY2xpZW50LmdldFJldmVsUm9vdCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIG1hcCBvZiBjb21tYW5kcyBjdXJyZW50bHkgYWN0aXZlIGZvciB0aGlzIGRldmljZS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBNYXAgb2YgY29tbWFuZHMgY3VycmVudGx5IGFjdGl2ZSBmb3IgdGhpcyBkZXZpY2UuXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdldENvbW1hbmRNYXAoKTogUHJvbWlzZTxhbnk+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGNsaWVudC5nZXRDb21tYW5kTWFwKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5kaWNhdGUgdG8gdGhlIHBsYXllciB0aGF0IHRoaXMgZ2FkZ2V0IGhhcyBmaW5pc2hlZCBpdCdzIHZpc3VhbGl6YXRpb24uXHJcbiAgICogVGhpcyBhbGxvd3MgdGhlIHBsYXllciB0byBwcm9jZWVkIHdpdGggdGhlIG5leHQgaXRlbSBpbiBhIHBsYXlsaXN0IGlmIGFwcGxpY2FibGUuXHJcbiAgICovXHJcbiAgcHVibGljIGZpbmlzaCgpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xyXG5cclxuICAgICAgY2xpZW50LmZpbmlzaCgpO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlzIHRoZSBnYWRnZXQgaXMgcnVubmluZyBpbiBwcmV2aWV3IG1vZGUuIFByZXZpZXcgbW9kZSBpcyBlbmFibGVkIHdoZW4gdGhlIGdhZGdldCBpc1xyXG4gICAqIGJlaW5nIGVkaXRlZCBpbiB0aGUgQ01TLCBvciBvdGhlcndpc2Ugbm90IHJ1bm5pbmcgaW4gYSBub3JtYWwgcGxheWVyIGVudmlyb25tZW50LlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGdhZGdldCBpcyBydW5uaW5nIGluIHByZXZpZXcgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBpc1ByZXZpZXdNb2RlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudCBpbnN0YW5jZW9mIE5vb3BDbGllbnQ7XHJcbiAgfVxyXG5cclxuICAgIFxyXG4gIC8vIC0tLVxyXG4gIC8vIFBSSVZBVEUgTUVUSE9EUy5cclxuICAvLyAtLS1cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgZ2V0Q2xpZW50KCk6IFByb21pc2U8Q2xpZW50PiB7XHJcblxyXG4gICAgaWYgKHRoaXMuY2xpZW50UHJvbWlzZSkge1xyXG5cclxuICAgICAgcmV0dXJuICh0aGlzLmNsaWVudFByb21pc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh3aW5kb3cuQ2xpZW50KSB7XHJcblxyXG4gICAgICByZXR1cm4gKHRoaXMuY2xpZW50UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh3aW5kb3cuQ2xpZW50KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQSBcImNvbXBsZXRlXCIgc3RhdHVzIGluZGljYXRlcyB0aGF0IHRoZSBcImxvYWRcIiBldmVudCBoYXMgYmVlbiBmaXJlZCBvbiB0aGVcclxuICAgIC8vIHdpbmRvdzsgYW5kLCB0aGF0IGFsbCBzdWItcmVzb3VyY2VzIHN1Y2ggYXMgU2NyaXB0cywgSW1hZ2VzLCBhbmQgRnJhbWVzIGhhdmVcclxuICAgIC8vIGJlZW4gbG9hZGVkLlxyXG4gICAgaWYgKHdpbmRvdy5kb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIpIHtcclxuXHJcbiAgICAgIC8vIElmIHRoaXMgZXZlbnQgaGFzIGZpcmVkIEFORCB0aGUgM3JkLXBhcnR5IHNjcmlwdCBpc24ndCBhdmFpbGFibGUgKHNlZSBJRi1cclxuICAgICAgLy8gY29uZGl0aW9uIEJFRk9SRSB0aGlzIG9uZSksIGl0IG1lYW5zIHRoYXQgdGhlIDNyZC1wYXJ0eSBzY3JpcHQgZWl0aGVyXHJcbiAgICAgIC8vIGZhaWxlZCBvbiB0aGUgbmV0d29yayBvciB3YXMgQkxPQ0tFRCBieSBhbiBhZC1ibG9ja2VyLiBBcyBzdWNoLCB3ZSBoYXZlIHRvXHJcbiAgICAgIC8vIGZhbGwtYmFjayB0byB1c2luZyBhIG1vY2sgQVBJLlxyXG4gICAgICByZXR1cm4gKHRoaXMuY2xpZW50UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShuZXcgTm9vcENsaWVudCgpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQVNTRVJUOiBJZiB3ZSBtYWRlIGl0IHRoaXMgZmFyLCB0aGUgZG9jdW1lbnQgaGFzIG5vdCBjb21wbGV0ZWQgbG9hZGluZyAoYnV0IGl0XHJcbiAgICAvLyBtYXkgYmUgaW4gYW4gXCJpbnRlcmFjdGl2ZVwiIHN0YXRlIHdoaWNoIGlzIHdoZW4gSSBiZWxpZXZlIHRoYXQgdGhlIEFuZ3VsYXIgYXBwXHJcbiAgICAvLyBnZXRzIGJvb3RzdHJhcHBlZCkuIEFzIHN1Y2gsIHdlIG5lZWQgYmluZCB0byB0aGUgTE9BRCBldmVudCB0byB3YWl0IGZvciBvdXJcclxuICAgIC8vIHRoaXJkLXBhcnR5IHNjcmlwdHMgdG8gbG9hZCAob3IgZmFpbCB0byBsb2FkLCBvciBiZSBibG9ja2VkKS5cclxuICAgIHRoaXMuY2xpZW50UHJvbWlzZSA9IG5ldyBQcm9taXNlPENsaWVudD4oXHJcbiAgICAgIChyZXNvbHZlKSA9PiB7XHJcblxyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICAgXCJsb2FkXCIsXHJcbiAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVXaW5kb3dMb2FkKCkge1xyXG5cclxuICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIDNyZC1wYXJ0eSBsaWJyYXJ5IGlzIGVpdGhlciBhdmFpbGFibGUgb3JcclxuICAgICAgICAgICAgLy8gaXQncyBub3QgLSB0aGVyZSdzIG5vIGZ1cnRoZXIgbG9hZGluZyB0byBkby4gSWYgaXQncyBub3RcclxuICAgICAgICAgICAgLy8gcHJlc2VudCBvbiB0aGUgZ2xvYmFsIHNjb3BlLCB3ZSdyZSBnb2luZyB0byBmYWxsLWJhY2sgdG8gdXNpbmdcclxuICAgICAgICAgICAgLy8gYSBtb2NrIEFQSS5cclxuICAgICAgICAgICAgcmVzb2x2ZSh3aW5kb3cuQ2xpZW50IHx8IG5ldyBOb29wQ2xpZW50KCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXHJcblxyXG4vLyBJIHByb3ZpZGUgYSBtb2NrIEFQSSBmb3IgdGhlIDNyZC1wYXJ0eSBzY3JpcHQuIFRoaXMganVzdCBhbGxvd3MgdGhlIGNvbnN1bWluZyBjb2RlIHRvXHJcbi8vIGFjdCBhcyB0aG91Z2ggdGhlIGxpYnJhcnkgaXMgYXZhaWxhYmxlIGV2ZW4gaWYgaXQgZmFpbGVkIHRvIGxvYWQgKGV4YW1wbGUsIGl0IHdhc1xyXG4vLyBibG9ja2VkIGJ5IGFuIGFkLWJsb2NrZXIpLlxyXG5cclxuLyoqIEBpZ25vcmUgKi9cclxuY2xhc3MgTm9vcENsaWVudCBpbXBsZW1lbnRzIENsaWVudCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAnJWNDbGllbnQgQVBJIG5vdCBhdmFpbGFibGUsIGZhbGxpbmcgYmFjayB0byBtb2NrIEFQSScsXHJcbiAgICAgICdiYWNrZ3JvdW5kLWNvbG9yOmJsdWU7IGNvbG9yOnllbGxvdzsnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbGxiYWNrKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XHJcblxyXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGV2aWNlVGltZShkYXRlPzogRGF0ZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWVab25lTmFtZSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVJRCgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTogUHJvbWlzZTxudW1iZXI+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldExhbmd1YWdlQ29kZSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlS2V5KCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZW5kQ29tbWFuZChuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VuZFJlbW90ZUNvbW1hbmQoZGV2aWNlS2V5czogc3RyaW5nW10sIG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpIHtcclxuXHJcbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0cmFjayhldmVudE5hbWU6IHN0cmluZywgcHJvcGVydGllcz86IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxyXG4gIH1cclxuXHJcbiAgcHVibGljIHRpbWVFdmVudChldmVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5ld0V2ZW50U2Vzc2lvbihpZD86IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFJldmVsUm9vdCgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0Q29tbWFuZE1hcCgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoJ3t9Jyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmluaXNoKCk6IHZvaWQge1xyXG5cclxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxyXG4gIH1cclxufVxyXG4iXX0=
423
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLWNsaWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmV2ZWxkaWdpdGFsL3BsYXllci1jbGllbnQvc3JjL2xpYi9wbGF5ZXItY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFtSWpELE1BQU0sT0FBTyxtQkFBbUI7SUFtRDlCLDBDQUEwQztJQUMxQyxpRUFBaUU7SUFDakUsMkNBQTJDO0lBQzNDLCtDQUErQztJQUMvQywrQ0FBK0M7SUFDL0Msc0RBQXNEO0lBQ3RELHdFQUF3RTtJQUN4RSxhQUFhO0lBQ2IseUJBQXlCO0lBQ3pCLEtBQUs7SUFFTCxjQUFjO0lBQ2QsWUFBWSxJQUFZO1FBMUR4Qjs7V0FFRztRQUNJLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQzNDOztXQUVHO1FBQ0ksYUFBUSxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDOztXQUVHO1FBQ0ksYUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDaEM7O1dBRUc7UUFDSSxZQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVUvQixjQUFjO1FBQ04sZ0JBQVcsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUNsRSxLQUFLLEVBQUUsRUFDUCxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUNuQixDQUFDO1FBR0YsY0FBYztRQUNOLGVBQVUsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFF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QU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWU7UUFFMUIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWTtRQUV2QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLFdBQVcsQ0FBQyxJQUFZLEVBQUUsR0FBVztRQUUxQyxvQ0FBb0M7SUFDdEMsQ0FBQztJQUVNLGlCQUFpQixDQUFDLFVBQW9CLEVBQUUsSUFBWSxFQUFFLEdBQVc7UUFFdEUsb0NBQW9DO0lBQ3RDLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBaUIsRUFBRSxVQUFtQjtRQUVqRCxvQ0FBb0M7SUFDdEMsQ0FBQztJQUVNLFNBQVMsQ0FBQyxTQUFpQjtRQUVoQyxvQ0FBb0M7SUFDdEMsQ0FBQztJQUVNLGVBQWUsQ0FBQyxFQUFXO1FBRWhDLG9DQUFvQztJQUN0QyxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVk7UUFFdkIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYTtRQUV4QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTO1FBRXBCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sTUFBTTtRQUVYLG9DQUFvQztJQUN0QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb21FdmVudCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgc2hhcmUsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgZ2FkZ2V0cyB9IGZyb20gJ0ByZXZlbGRpZ2l0YWwvZ2FkZ2V0LXR5cGVzJztcclxuXHJcblxyXG4vLyBTbyB0aGF0IFR5cGVTY3JpcHQgZG9lc24ndCBjb21wbGFpbiwgd2UncmUgZ29pbmcgdG8gYXVnbWVudCB0aGUgR0xPQkFMIC8gV0lORE9XIFxyXG4vLyBuYW1lLXNwYWNlIGRlZmluaXRpb24gdG8gaW5jbHVkZSB0aGUgVHJhY2tlciBBUEkuIFRoaXMgYWxzbyBwcm92aWRlcyB1cyB3aXRoIGEgcGxhY2VcclxuLy8gdG8gYWN0dWFsbHkgRE9DVU1FTlQgdGhlIEFQSSBzbyB0aGF0IG91ciBkZXZlbG9wZXJzIGFyZW4ndCBndWVzc2luZyBhYm91dCB3aGF0J3NcclxuLy8gYXZhaWxhYmxlIG9uIHRoZSBsaWJyYXJ5LlxyXG5cclxuLyoqIEBpZ25vcmUgKi9cclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gIHZhciBDbGllbnQ6IElDbGllbnQ7XHJcbn1cclxuXHJcbi8qKiBAaWdub3JlICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNsaWVudCB7XHJcblxyXG4gIGNhbGxiYWNrKC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcclxuXHJcbiAgZ2V0RGV2aWNlVGltZShkYXRlPzogRGF0ZSk6IFByb21pc2U8c3RyaW5nPjtcclxuXHJcbiAgZ2V0RGV2aWNlVGltZVpvbmVOYW1lKCk6IFByb21pc2U8c3RyaW5nPjtcclxuXHJcbiAgZ2V0RGV2aWNlVGltZVpvbmVJRCgpOiBQcm9taXNlPHN0cmluZz47XHJcblxyXG4gIGdldERldmljZVRpbWVab25lT2Zmc2V0KCk6IFByb21pc2U8bnVtYmVyPjtcclxuXHJcbiAgZ2V0TGFuZ3VhZ2VDb2RlKCk6IFByb21pc2U8c3RyaW5nPjtcclxuXHJcbiAgZ2V0RGV2aWNlS2V5KCk6IFByb21pc2U8c3RyaW5nPjtcclxuXHJcbiAgc2VuZENvbW1hbmQobmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZyk6IHZvaWQ7XHJcblxyXG4gIHNlbmRSZW1vdGVDb21tYW5kKGRldmljZUtleXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZDtcclxuXHJcbiAgdHJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBzdHJpbmcpOiB2b2lkO1xyXG5cclxuICB0aW1lRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkO1xyXG5cclxuICBuZXdFdmVudFNlc3Npb24oaWQ/OiBzdHJpbmcpOiB2b2lkO1xyXG5cclxuICBnZXRSZXZlbFJvb3QoKTogUHJvbWlzZTxzdHJpbmc+O1xyXG5cclxuICBnZXRDb21tYW5kTWFwKCk6IFByb21pc2U8c3RyaW5nPjtcclxuXHJcbiAgZ2V0RGV2aWNlKCk6IFByb21pc2U8c3RyaW5nPjtcclxuXHJcbiAgZmluaXNoKCk6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRQcm9wZXJ0aWVzIHtcclxuICBba2V5OiBzdHJpbmddOiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZCB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGFyZzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMb2NhdGlvbiB7XHJcbiAgbGF0aXR1ZGU6IG51bWJlcjtcclxuICBsb25naXR1ZGU6IG51bWJlcjtcclxuICBjaXR5OiBzdHJpbmc7XHJcbiAgc3RhdGU6IHN0cmluZztcclxuICBhZGRyZXNzOiBzdHJpbmc7XHJcbiAgY291bnRyeTogc3RyaW5nO1xyXG4gIHBvc3RhbENvZGU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGV2aWNlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogRGV2aWNlIG5hbWVcclxuICAgKiBcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIG5hbWU6IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogRGV2aWNlIGtleVxyXG4gICAqIFxyXG4gICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICovXHJcbiAgcmVnaXN0cmF0aW9uS2V5OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIERldmljZSB0eXBlXHJcbiAgICogXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cclxuICBkZXZpY2VUeXBlOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVudGVyZWQgc2VydmljZSBkYXRlXHJcbiAgICogXHJcbiAgICogQHR5cGUge0RhdGV9XHJcbiAgICovXHJcbiAgZW50ZXJlZFNlcnZpY2U6IERhdGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIExhbmd1YWdlIGNvZGVcclxuICAgKiBcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIGxhbmdDb2RlPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBUaW1lIHpvbmVcclxuICAgKiBcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIHRpbWVab25lPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBEZXZpY2UgcHJvcGVydGllc1xyXG4gICAqIFxyXG4gICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxyXG4gICAqL1xyXG4gIHRhZ3M6IEFycmF5PHN0cmluZz47XHJcblxyXG4gIC8qKlxyXG4gICAqIERldmljZSBsb2NhdGlvblxyXG4gICAqIFxyXG4gICAqIEB0eXBlIHtJTG9jYXRpb259XHJcbiAgICovXHJcbiAgbG9jYXRpb24/OiBJTG9jYXRpb247XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFBsYXllckNsaWVudFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgY2xpZW50UHJvbWlzZTogUHJvbWlzZTxJQ2xpZW50PiB8IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbW1hbmRzIHNlbnQgdG8gdGhpcyBwbGF5ZXIuXHJcbiAgICovXHJcbiAgcHVibGljIG9uQ29tbWFuZCQgPSBuZXcgU3ViamVjdDxDb21tYW5kPigpO1xyXG4gIC8qKlxyXG4gICAqIFNpZ25hbHMgdGhlIGdhZGdldCBoYXMgYmVlbiBsb2FkZWQgYW5kIGlzIHJlYWR5IHRvIHN0YXJ0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvblJlYWR5JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xyXG4gIC8qKlxyXG4gICAqIFNpZ25hbHMgdGhlIGdhZGdldCBoYXMgYmVlbiBzdGFydGVkIGJ5IHRoZSBwbGF5ZXIuXHJcbiAgICovXHJcbiAgcHVibGljIG9uU3RhcnQkID0gbmV3IFN1YmplY3QoKTtcclxuICAvKipcclxuICAgKiBTaWduYWxzIHRoZSBnYWRnZXRzIGhhcyBiZWVuIHN0b3BwZWQgYnkgdGhlIHBsYXllci5cclxuICAgKi9cclxuICBwdWJsaWMgb25TdG9wJCA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIC8vXHJcbiAgLy8gVHdvIG1ldGhvZHMgYXZhaWxhYmxlIGZvciBjYWxsaW5nIGludG8gdGhlIGxpYnJhcnk6XHJcbiAgLy9cclxuICAvLyAxKSBVc2luZyBkaXNwYXRjaEV2ZW50KCkgd2l0aCB0aGUgZm9sbG93aW5nIGN1c3RvbSBldmVudHNcclxuICAvLyAyKSBVc2luZyB0aGUgd2luZG93IHNjb3BlZCBSZXZlbERpZ2l0YWwgb2JqZWN0IGFzIGRlZmluZWQgaW4gdGhlIGNvbnN0cnVjdG9yXHJcbiAgLy9cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgb25TdGFydFN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBvblN0YXJ0RXZ0JCA9IGZyb21FdmVudChkb2N1bWVudCwgJ1JldmVsRGlnaXRhbC5TdGFydCcpLnBpcGUoXHJcbiAgICBzaGFyZSgpLFxyXG4gICAgdGFwKHRoaXMub25TdGFydCQpXHJcbiAgKTtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgb25TdG9wU3ViOiBTdWJzY3JpcHRpb247XHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIG9uU3RvcEV2dCQgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdSZXZlbERpZ2l0YWwuU3RvcCcpLnBpcGUoXHJcbiAgICBzaGFyZSgpLFxyXG4gICAgdGFwKHRoaXMub25TdG9wJClcclxuICApO1xyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBvbkNvbW1hbmRTdWI6IFN1YnNjcmlwdGlvbjtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgb25Db21tYW5kRXZ0JCA9IGZyb21FdmVudDxDb21tYW5kPihkb2N1bWVudCwgJ1JldmVsRGlnaXRhbC5Db21tYW5kJykucGlwZShcclxuICAgIG1hcCgoZTogYW55KSA9PiB7IHJldHVybiB7IG5hbWU6IGUuZGV0YWlsLm5hbWUsIGFyZzogZS5kZXRhaWwuYXJnIH0gYXMgQ29tbWFuZCB9KSxcclxuICAgIHNoYXJlKCksXHJcbiAgICB0YXAodGhpcy5vbkNvbW1hbmQkKVxyXG4gICk7XHJcblxyXG4gIC8vIHByaXZhdGUgb25Qb3N0TWVzc2FnZVN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIC8vIHByaXZhdGUgb25Qb3N0TWVzc2FnZUV2dCQgPSBmcm9tRXZlbnQod2luZG93LCAnbWVzc2FnZScpLnBpcGUoXHJcbiAgLy8gICBmaWx0ZXIoKG1lc3NhZ2VFdmVudDogTWVzc2FnZUV2ZW50KSA9PlxyXG4gIC8vICAgICBtZXNzYWdlRXZlbnQuc291cmNlICE9PSB3aW5kb3cucGFyZW50ICYmXHJcbiAgLy8gICAgIHR5cGVvZiBtZXNzYWdlRXZlbnQuZGF0YSA9PT0gJ3N0cmluZycgJiZcclxuICAvLyAgICAgbWVzc2FnZUV2ZW50LmRhdGEuc3RhcnRzV2l0aCgncmV2ZWxkaWdpdGFsOicpKSxcclxuICAvLyAgIG1hcCgoZTogYW55KSA9PiB7IHJldHVybiBKU09OLnBhcnNlKGUuc3Vic3RyaW5nKDEzKSkgYXMgQ29tbWFuZCB9KSxcclxuICAvLyAgIHNoYXJlKCksXHJcbiAgLy8gICB0YXAodGhpcy5vbkNvbW1hbmQkKVxyXG4gIC8vICk7XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgY29uc3RydWN0b3Ioem9uZTogTmdab25lKSB7XHJcblxyXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLlJldmVsRGlnaXRhbCA9IHtcclxuICAgICAgQ29udHJvbGxlcjoge1xyXG4gICAgICAgIG9uQ29tbWFuZDogZnVuY3Rpb24gKG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpIHtcclxuICAgICAgICAgIHpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgc2VsZi5vbkNvbW1hbmQkLm5leHQoeyBuYW1lOiBuYW1lLCBhcmc6IGFyZyB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25TdGFydDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBzZWxmLm9uU3RhcnQkLm5leHQobnVsbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uU3RvcDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBzZWxmLm9uU3RvcCQubmV4dChudWxsKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub25TdGFydFN1YiA9IHRoaXMub25TdGFydEV2dCQuc3Vic2NyaWJlKCgpID0+IHsgfSk7XHJcbiAgICB0aGlzLm9uU3RvcFN1YiA9IHRoaXMub25TdG9wRXZ0JC5zdWJzY3JpYmUoKCkgPT4geyB9KTtcclxuICAgIHRoaXMub25Db21tYW5kU3ViID0gdGhpcy5vbkNvbW1hbmRFdnQkLnN1YnNjcmliZSgoKSA9PiB7IH0pO1xyXG5cclxuICAgIHRoaXMuY2xpZW50UHJvbWlzZSA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5vblJlYWR5JC5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLm9uU3RhcnRTdWI/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLm9uU3RvcFN1Yj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMub25Db21tYW5kU3ViPy51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMub25SZWFkeSQubmV4dChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgaW5pdChkYXRhOiBhbnkpIHtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgJyVj4pqZ77iPIEluaXRpYWxpemluZyBSZXZlbCBEaWdpdGFsIGNsaWVudCBsaWJyYXJ5JyxcclxuICAgICAgJ2JhY2tncm91bmQtY29sb3I6Ymx1ZTsgY29sb3I6eWVsbG93OydcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIGdhZGdldCB0byBjb21tdW5pY2F0ZSB3aXRoIHBsYXllciBzY3JpcHRpbmcuXHJcbiAgICogSWYgdGhlIGFwcHJvcHJpYXRlIHNjcmlwdGluZyBpcyBpbiBwbGFjZSBpbiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVtcGxhdGUsIGNhbGxpbmcgdGhpcyBtZXRob2RcclxuICAgKiB3aWxsIGluaXRpYXRlIGEgY2FsbGJhY2sgd2hpY2ggY2FuIGJlIGFjdGVkIHVwb24gaW4gcGxheWVyIHNjcmlwdC5cclxuICAgKiBcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGNsaWVudC5jYWxsYmFjaygndGVzdCcsICd0aGlzJyk7XHJcbiAgICogXHJcbiAgICogQHBhcmFtIGFyZ3MgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50c1xyXG4gICAqL1xyXG4gIHB1YmxpYyBjYWxsYmFjayguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcblxyXG4gICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgY2xpZW50LmNhbGxiYWNrKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1swXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1sxXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1syXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1szXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1s0XSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFjY2Vzc29yIG1ldGhvZCBmb3IgdGhlIHVzZXIgcHJlZmVyZW5jZXMgaW50ZXJmYWNlIGV4cG9zZWQgYnkgdGhlIEdhZGdldHMgQVBJLlxyXG4gICAqIFxyXG4gICAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vZ2FkZ2V0cy9kb2NzL2Jhc2ljfSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBHYWRnZXRzIEFQSS5cclxuICAgKiBcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGllbnQ6IFBsYXllckNsaWVudFNlcnZpY2UpIHtcclxuICAgKiAgICAgICAgICAgIGxldCBwcmVmcyA9IGNsaWVudC5nZXRQcmVmcygpO1xyXG4gICAqICAgICAgICAgICAgbGV0IG15U3RyaW5nID0gcHJlZnMuZ2V0U3RyaW5nKCdteVN0cmluZ1ByZWYnKTtcclxuICAgKiB9XHJcbiAgICogQHJldHVybnMge2dhZGdldHMuUHJlZnN9IEdhZGdldCBBUEkgUHJlZnMgb2JqZWN0XHJcbiAgICovXHJcbiAgcHVibGljIGdldFByZWZzKCk6IGdhZGdldHMuUHJlZnMge1xyXG5cclxuICAgIHJldHVybiBuZXcgd2luZG93WydnYWRnZXRzJ11bJ1ByZWZzJ10oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZGV2aWNlIHRpbWUgaW4gSVNPODYwMSBmb3JtYXQuXHJcbiAgICogQ3VycmVudCBkZXZpY2UgdGltZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBkZXZpY2UgdGltZXpvbmUgYXNzaWduZWQgdG8gdGhlIGRldmljZSBpbiB0aGUgQ01TLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBkYXRlIE9wdGlvbmFsLiBJZiBzdXBwbGllZCB3aWxsIHRyYW5zbGF0ZSB0aGUgc3VwcGxpZWQgZGF0ZS90aW1lIHRvIGRldmljZSB0aW1lIGJhc2VkIG9uIHJlc3BlY3RpdmUgdGltZXpvbmVzLlxyXG4gICAqIEByZXR1cm5zIERhdGUvdGltZSBpbiBJU084NjAxIGZvcm1hdFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lKGRhdGU/OiBEYXRlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIGlmIChkYXRlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lKGRhdGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSB0aW1lem9uZSBuYW1lIGN1cnJlbnRseSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFRpbWV6b25lIE5hbWVcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gY2xpZW50LmdldERldmljZVRpbWVab25lTmFtZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdGltZXpvbmUgSUQgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBkZXZpY2UuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgVGltZXpvbmUgSURcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVJRCgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lWm9uZUlEKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBudW1lcmljYWwgb2Zmc2V0IGZyb20gR01UIG9mIHRoZSB0aW1lem9uZSBjdXJyZW50bHkgYXNzaWduZWQgdG8gdGhlIGRldmljZS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBUaW1lem9uZSBvZmZzZXRcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTogUHJvbWlzZTxudW1iZXI+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGxhbmd1YWdlIGNvZGUgb2YgdGhlIGxhbmd1YWdlIGN1cnJlbnRseSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIExhbmd1YWdlIGNvZGVcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0TGFuZ3VhZ2VDb2RlKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gY2xpZW50LmdldExhbmd1YWdlQ29kZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdW5pcXVlIFJldmVsIERpZ2l0YWwgZGV2aWNlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBEZXZpY2Uga2V5XHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZUtleSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VLZXkoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBwbGF5ZXIgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBuYW1lIENvbW1hbmQgbmFtZVxyXG4gICAqIEBwYXJhbSBhcmcgQ29tbWFuZCBhcmd1bWVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZW5kQ29tbWFuZChuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcclxuICAgICAgY2xpZW50LnNlbmRDb21tYW5kKG5hbWUsIGFyZyk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBhIGNvbW1hbmQgdG8gYW55IHJlbW90ZSBwbGF5ZXIgd2l0aCB0aGUgc3VwcGxpZWQgZGV2aWNlIGtleShzKS5cclxuICAgKiBOb3RlOiBSZW1vdGUgY29tbWFuZHMgY2FuIG9ubHkgYmUgZGVsaXZlcmVkIHRvIGRldmljZXMgd2l0aGluIHRoZSBzYW1lIGFjY291bnQgYXMgdGhlIHNlbmRlciBkZXZpY2UuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGRldmljZUtleXMgQXJyYXkgb2YgcmVtb3RlIGRldmljZSBrZXlzXHJcbiAgICogQHBhcmFtIG5hbWUgQ29tbWFuZCBuYW1lXHJcbiAgICogQHBhcmFtIGFyZyBDb21tYW5kIGFyZ1xyXG4gICAqL1xyXG4gIHB1YmxpYyBzZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcbiAgICAgIGNsaWVudC5zZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzLCBuYW1lLCBhcmcpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2cgYW4gZXZlbnQgZm9yIHVzZSB3aXRoIEFkSGF3ayBhbmFseXRpY3MuXHJcbiAgICogRXZlbnRzIGFyZSB1c2VkIGZvciB0cmFja2luZyB2YXJpb3VzIG1ldHJpY3MgaW5jbHVkaW5nIHVzYWdlIHN0YXRpc3RpY3MsIHBsYXllciBjb25kaXRpb24sIHN0YXRlIGNoYW5nZXMsIGV0Yy5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gZXZlbnROYW1lIFVuaXF1ZSBuYW1lIGZvciB0aGlzIGV2ZW50XHJcbiAgICogQHBhcmFtIHByb3BlcnRpZXMgQSBtYXAgb2YgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBldmVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyB0cmFjayhldmVudE5hbWU6IHN0cmluZywgcHJvcGVydGllcz86IEV2ZW50UHJvcGVydGllcyk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcbiAgICAgIGNsaWVudC50cmFjayhldmVudE5hbWUsIEpTT04uc3RyaW5naWZ5KHByb3BlcnRpZXMpKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRob2QgZm9yIGluaXRpYXRpbmcgYSB0aW1lZCBldmVudC5cclxuICAgKiBUaW1lZCBldmVudHMgYXJlIHVzZWZ1bCBmb3IgdHJhY2tpbmcgdGhlIGR1cmF0aW9uIG9mIGFuIGV2ZW50IGFuZCBtdXN0IGJlIHByb2NlZWRlZCB3aXRoIGEgY2FsbCB0byB0cmFjaygpLlxyXG4gICAqIFxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogY2xpZW50LnRpbWVFdmVudCgndGVzdEV2ZW50Jyk7XHJcbiAgICogY2xpZW50LnRyYWNrKFwidGVzdFwiLCB7IFwiYVwiOiBcImJcIiB9KTtcclxuICAgKiBAcGFyYW0gZXZlbnROYW1lIFVuaXF1ZSBuYW1lIGZvciB0aGlzIGV2ZW50XHJcbiAgICovXHJcbiAgcHVibGljIHRpbWVFdmVudChldmVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcbiAgICAgIGNsaWVudC50aW1lRXZlbnQoZXZlbnROYW1lKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHNlc3Npb24gaXMgYSB3YXkgb2YgZ3JvdXBpbmcgZXZlbnRzIHRvZ2V0aGVyLiBFYWNoIGV2ZW50IGhhcyBhbiBhc3NvY2lhdGVkIHNlc3Npb24gSUQuXHJcbiAgICogU2Vzc2lvbiBJRCdzIGFyZSByYW5kb21seSBnZW5lcmF0ZWQgYW5kIHJlc2V0IGJ5IHN1YnNlcXVlbnQgY2FsbHMgdG8gbmV3RXZlbnRTZXNzaW9uKCkuXHJcbiAgICogXHJcbiAgICogRWFjaCBjYWxsIHRvIHRyYWNrKCkgd2lsbCB1dGlsaXplIHRoZSBzYW1lIHNlc3Npb24gSUQsIHVudGlsIGFub3RoZXIgY2FsbCB0byBuZXdFdmVudFNlc3Npb24oKS5cclxuICAgKiBAcGFyYW0gaWQgT3B0aW9uYWwuIFVzZXIgc3VwcGxpZWQgc2Vzc2lvbiBJRC4gSWYgbm90IHN1cHBsaWVkIGEgcmFuZG9tIHNlc3Npb24gSUQgd2lsbCBiZSBnZW5lcmF0ZWQuXHJcbiAgICovXHJcbiAgcHVibGljIG5ld0V2ZW50U2Vzc2lvbihpZD86IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XHJcbiAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY2xpZW50Lm5ld0V2ZW50U2Vzc2lvbigpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNsaWVudC5uZXdFdmVudFNlc3Npb24oaWQpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgcm9vdCBmb2xkZXIgdXRpbGl6ZWQgYnkgdGhpcyBwbGF5ZXIgZGV2aWNlLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFBhdGggdG8gdGhlIHJvb3QgZm9sZGVyXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdldFJldmVsUm9vdCgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNsaWVudC5nZXRSZXZlbFJvb3QoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBtYXAgb2YgY29tbWFuZHMgY3VycmVudGx5IGFjdGl2ZSBmb3IgdGhpcyBkZXZpY2UuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgTWFwIG9mIGNvbW1hbmRzIGN1cnJlbnRseSBhY3RpdmUgZm9yIHRoaXMgZGV2aWNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXRDb21tYW5kTWFwKCk6IFByb21pc2U8YW55PiB7XHJcblxyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcclxuXHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShhd2FpdCBjbGllbnQuZ2V0Q29tbWFuZE1hcCgpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZGljYXRlIHRvIHRoZSBwbGF5ZXIgdGhhdCB0aGlzIGdhZGdldCBoYXMgZmluaXNoZWQgaXQncyB2aXN1YWxpemF0aW9uLlxyXG4gICAqIFRoaXMgYWxsb3dzIHRoZSBwbGF5ZXIgdG8gcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGl0ZW0gaW4gYSBwbGF5bGlzdCBpZiBhcHBsaWNhYmxlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaW5pc2goKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcclxuXHJcbiAgICAgIGNsaWVudC5maW5pc2goKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpcyB0aGUgZ2FkZ2V0IGlzIHJ1bm5pbmcgaW4gcHJldmlldyBtb2RlLiBQcmV2aWV3IG1vZGUgaXMgZW5hYmxlZCB3aGVuIHRoZSBnYWRnZXQgaXNcclxuICAgKiBiZWluZyBlZGl0ZWQgaW4gdGhlIENNUywgb3Igb3RoZXJ3aXNlIG5vdCBydW5uaW5nIGluIGEgbm9ybWFsIHBsYXllciBlbnZpcm9ubWVudC5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBnYWRnZXQgaXMgcnVubmluZyBpbiBwcmV2aWV3IG1vZGUsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgaXNQcmV2aWV3TW9kZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuXHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xyXG5cclxuICAgIHJldHVybiBjbGllbnQgaW5zdGFuY2VvZiBOb29wQ2xpZW50O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIFJldHVybnMgdGhlIGRldmljZSBkZXRhaWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGxheWVyIHJ1bm5pbmcgdGhlIGdhZGdldCBvciB3ZWIgYXBwLlxyXG4gKiBcclxuICogQHJldHVybnMgRGV2aWNlIGRldGFpbHMuXHJcbiAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2UoKTogUHJvbWlzZTxJRGV2aWNlIHwgbnVsbD4ge1xyXG5cclxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XHJcblxyXG4gICAgbGV0IG9iajogYW55ID0gSlNPTi5wYXJzZSg8c3RyaW5nPmF3YWl0IGNsaWVudC5nZXREZXZpY2UoKSk7XHJcblxyXG4gICAgY29uc3QgZGV2aWNlOiBJRGV2aWNlW10gPSBbb2JqXS5tYXAoKGRldmljZTogYW55KSA9PiB7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIG5hbWU6IGRldmljZS5uYW1lLFxyXG4gICAgICAgIHJlZ2lzdHJhdGlvbktleTogZGV2aWNlLmtleSxcclxuICAgICAgICBkZXZpY2VUeXBlOiBkZXZpY2UuZGV2aWNldHlwZSxcclxuICAgICAgICBlbnRlcmVkU2VydmljZTogbmV3IERhdGUoZGV2aWNlLmVudGVyZWRzZXJ2aWNlKSxcclxuICAgICAgICBsYW5nQ29kZTogZGV2aWNlLmxhbmdjb2RlLFxyXG4gICAgICAgIHRpbWVab25lOiBkZXZpY2UudGltZXpvbmUsXHJcbiAgICAgICAgdGFnczogZGV2aWNlLmRlc2NyaXB0aW9uPy5zcGxpdCgnXFxuJyksXHJcbiAgICAgICAgbG9jYXRpb246IHtcclxuICAgICAgICAgIGNpdHk6IGRldmljZS5sb2NhdGlvbj8uY2l0eSxcclxuICAgICAgICAgIHN0YXRlOiBkZXZpY2UubG9jYXRpb24/LnN0YXRlLFxyXG4gICAgICAgICAgY291bnRyeTogZGV2aWNlLmxvY2F0aW9uPy5jb3VudHJ5LFxyXG4gICAgICAgICAgcG9zdGFsQ29kZTogZGV2aWNlLmxvY2F0aW9uPy5wb3N0YWxjb2RlLFxyXG4gICAgICAgICAgYWRkcmVzczogZGV2aWNlLmxvY2F0aW9uPy5hZGRyZXNzLFxyXG4gICAgICAgICAgbGF0aXR1ZGU6IGRldmljZS5sb2NhdGlvbj8ubGF0aXR1ZGUsXHJcbiAgICAgICAgICBsb25naXR1ZGU6IGRldmljZS5sb2NhdGlvbj8ubG9uZ2l0dWRlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBkZXZpY2VbMF07XHJcbiAgfVxyXG5cclxuICAvLyAtLS1cclxuICAvLyBQUklWQVRFIE1FVEhPRFMuXHJcbiAgLy8gLS0tXHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIGdldENsaWVudCgpOiBQcm9taXNlPElDbGllbnQ+IHtcclxuXHJcbiAgICBpZiAodGhpcy5jbGllbnRQcm9taXNlKSB7XHJcblxyXG4gICAgICByZXR1cm4gKHRoaXMuY2xpZW50UHJvbWlzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvdy5DbGllbnQpIHtcclxuXHJcbiAgICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5DbGllbnQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBIFwiY29tcGxldGVcIiBzdGF0dXMgaW5kaWNhdGVzIHRoYXQgdGhlIFwibG9hZFwiIGV2ZW50IGhhcyBiZWVuIGZpcmVkIG9uIHRoZVxyXG4gICAgLy8gd2luZG93OyBhbmQsIHRoYXQgYWxsIHN1Yi1yZXNvdXJjZXMgc3VjaCBhcyBTY3JpcHRzLCBJbWFnZXMsIGFuZCBGcmFtZXMgaGF2ZVxyXG4gICAgLy8gYmVlbiBsb2FkZWQuXHJcbiAgICBpZiAod2luZG93LmRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIikge1xyXG5cclxuICAgICAgLy8gSWYgdGhpcyBldmVudCBoYXMgZmlyZWQgQU5EIHRoZSAzcmQtcGFydHkgc2NyaXB0IGlzbid0IGF2YWlsYWJsZSAoc2VlIElGLVxyXG4gICAgICAvLyBjb25kaXRpb24gQkVGT1JFIHRoaXMgb25lKSwgaXQgbWVhbnMgdGhhdCB0aGUgM3JkLXBhcnR5IHNjcmlwdCBlaXRoZXJcclxuICAgICAgLy8gZmFpbGVkIG9uIHRoZSBuZXR3b3JrIG9yIHdhcyBCTE9DS0VEIGJ5IGFuIGFkLWJsb2NrZXIuIEFzIHN1Y2gsIHdlIGhhdmUgdG9cclxuICAgICAgLy8gZmFsbC1iYWNrIHRvIHVzaW5nIGEgbW9jayBBUEkuXHJcbiAgICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKG5ldyBOb29wQ2xpZW50KCkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBU1NFUlQ6IElmIHdlIG1hZGUgaXQgdGhpcyBmYXIsIHRoZSBkb2N1bWVudCBoYXMgbm90IGNvbXBsZXRlZCBsb2FkaW5nIChidXQgaXRcclxuICAgIC8vIG1heSBiZSBpbiBhbiBcImludGVyYWN0aXZlXCIgc3RhdGUgd2hpY2ggaXMgd2hlbiBJIGJlbGlldmUgdGhhdCB0aGUgQW5ndWxhciBhcHBcclxuICAgIC8vIGdldHMgYm9vdHN0cmFwcGVkKS4gQXMgc3VjaCwgd2UgbmVlZCBiaW5kIHRvIHRoZSBMT0FEIGV2ZW50IHRvIHdhaXQgZm9yIG91clxyXG4gICAgLy8gdGhpcmQtcGFydHkgc2NyaXB0cyB0byBsb2FkIChvciBmYWlsIHRvIGxvYWQsIG9yIGJlIGJsb2NrZWQpLlxyXG4gICAgdGhpcy5jbGllbnRQcm9taXNlID0gbmV3IFByb21pc2U8SUNsaWVudD4oXHJcbiAgICAgIChyZXNvbHZlKSA9PiB7XHJcblxyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICAgXCJsb2FkXCIsXHJcbiAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVXaW5kb3dMb2FkKCkge1xyXG5cclxuICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIDNyZC1wYXJ0eSBsaWJyYXJ5IGlzIGVpdGhlciBhdmFpbGFibGUgb3JcclxuICAgICAgICAgICAgLy8gaXQncyBub3QgLSB0aGVyZSdzIG5vIGZ1cnRoZXIgbG9hZGluZyB0byBkby4gSWYgaXQncyBub3RcclxuICAgICAgICAgICAgLy8gcHJlc2VudCBvbiB0aGUgZ2xvYmFsIHNjb3BlLCB3ZSdyZSBnb2luZyB0byBmYWxsLWJhY2sgdG8gdXNpbmdcclxuICAgICAgICAgICAgLy8gYSBtb2NrIEFQSS5cclxuICAgICAgICAgICAgcmVzb2x2ZSh3aW5kb3cuQ2xpZW50IHx8IG5ldyBOb29wQ2xpZW50KCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXHJcblxyXG4vLyBJIHByb3ZpZGUgYSBtb2NrIEFQSSBmb3IgdGhlIDNyZC1wYXJ0eSBzY3JpcHQuIFRoaXMganVzdCBhbGxvd3MgdGhlIGNvbnN1bWluZyBjb2RlIHRvXHJcbi8vIGFjdCBhcyB0aG91Z2ggdGhlIGxpYnJhcnkgaXMgYXZhaWxhYmxlIGV2ZW4gaWYgaXQgZmFpbGVkIHRvIGxvYWQgKGV4YW1wbGUsIGl0IHdhc1xyXG4vLyBibG9ja2VkIGJ5IGFuIGFkLWJsb2NrZXIpLlxyXG5cclxuLyoqIEBpZ25vcmUgKi9cclxuY2xhc3MgTm9vcENsaWVudCBpbXBsZW1lbnRzIElDbGllbnQge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgJyVjQ2xpZW50IEFQSSBub3QgYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gbW9jayBBUEknLFxyXG4gICAgICAnYmFja2dyb3VuZC1jb2xvcjpibHVlOyBjb2xvcjp5ZWxsb3c7J1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjYWxsYmFjayguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xyXG5cclxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERldmljZVRpbWUoZGF0ZT86IERhdGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IERhdGUoKS50b0lTT1N0cmluZygpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lWm9uZU5hbWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWVab25lSUQoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWVab25lT2Zmc2V0KCk6IFByb21pc2U8bnVtYmVyPiB7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRMYW5ndWFnZUNvZGUoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERldmljZUtleSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VuZENvbW1hbmQobmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbmRSZW1vdGVDb21tYW5kKGRldmljZUtleXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKSB7XHJcblxyXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdHJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0aW1lRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZXdFdmVudFNlc3Npb24oaWQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRSZXZlbFJvb3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldENvbW1hbmRNYXAoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCd7fScpO1xyXG4gIH1cclxuICBcclxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmluaXNoKCk6IHZvaWQge1xyXG5cclxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxyXG4gIH1cclxufVxyXG4iXX0=
@@ -315,6 +315,39 @@ class PlayerClientService {
315
315
  return client instanceof NoopClient;
316
316
  });
317
317
  }
318
+ /**
319
+ * Returns the device details associated with the player running the gadget or web app.
320
+ *
321
+ * @returns Device details.
322
+ */
323
+ getDevice() {
324
+ return __awaiter(this, void 0, void 0, function* () {
325
+ const client = yield this.getClient();
326
+ let obj = JSON.parse(yield client.getDevice());
327
+ const device = [obj].map((device) => {
328
+ var _a, _b, _c, _d, _e, _f, _g, _h;
329
+ return {
330
+ name: device.name,
331
+ registrationKey: device.key,
332
+ deviceType: device.devicetype,
333
+ enteredService: new Date(device.enteredservice),
334
+ langCode: device.langcode,
335
+ timeZone: device.timezone,
336
+ tags: (_a = device.description) === null || _a === void 0 ? void 0 : _a.split('\n'),
337
+ location: {
338
+ city: (_b = device.location) === null || _b === void 0 ? void 0 : _b.city,
339
+ state: (_c = device.location) === null || _c === void 0 ? void 0 : _c.state,
340
+ country: (_d = device.location) === null || _d === void 0 ? void 0 : _d.country,
341
+ postalCode: (_e = device.location) === null || _e === void 0 ? void 0 : _e.postalcode,
342
+ address: (_f = device.location) === null || _f === void 0 ? void 0 : _f.address,
343
+ latitude: (_g = device.location) === null || _g === void 0 ? void 0 : _g.latitude,
344
+ longitude: (_h = device.location) === null || _h === void 0 ? void 0 : _h.longitude
345
+ }
346
+ };
347
+ });
348
+ return device[0];
349
+ });
350
+ }
318
351
  // ---
319
352
  // PRIVATE METHODS.
320
353
  // ---
@@ -426,6 +459,11 @@ class NoopClient {
426
459
  return Promise.resolve('{}');
427
460
  });
428
461
  }
462
+ getDevice() {
463
+ return __awaiter(this, void 0, void 0, function* () {
464
+ return Promise.resolve(null);
465
+ });
466
+ }
429
467
  finish() {
430
468
  // NOOP implement, nothing to do....
431
469
  }
@@ -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 { BehaviorSubject, fromEvent, Subject, Subscription } from 'rxjs';\r\nimport { map, share, tap } from 'rxjs/operators';\r\nimport { gadgets } from '@reveldigital/gadget-types';\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: Client;\r\n}\r\n\r\n/** @ignore */\r\nexport interface Client {\r\n\r\n callback(...args: any[]): void;\r\n\r\n getDeviceTime(date?: Date): Promise<string>;\r\n\r\n getDeviceTimeZoneName(): Promise<string>;\r\n\r\n getDeviceTimeZoneID(): Promise<string>;\r\n\r\n getDeviceTimeZoneOffset(): Promise<number>;\r\n\r\n getLanguageCode(): Promise<string>;\r\n\r\n getDeviceKey(): Promise<string>;\r\n\r\n sendCommand(name: string, arg: string): void;\r\n\r\n sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void;\r\n\r\n track(eventName: string, properties?: string): void;\r\n\r\n timeEvent(eventName: string): void;\r\n\r\n newEventSession(id?: string): void;\r\n\r\n getRevelRoot(): Promise<string>;\r\n\r\n getCommandMap(): Promise<string>;\r\n\r\n finish(): void;\r\n}\r\n\r\nexport interface EventProperties {\r\n [key: string]: any;\r\n}\r\n\r\nexport interface Command {\r\n name: string;\r\n arg: string;\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<Client> | null;\r\n\r\n /**\r\n * Commands sent to this player.\r\n */\r\n public onCommand$ = new Subject<Command>();\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<Command>(document, 'RevelDigital.Command').pipe(\r\n map((e: any) => { return { name: e.detail.name, arg: e.detail.arg } as Command }),\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?: EventProperties): 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 // ---\r\n // PRIVATE METHODS.\r\n // ---\r\n /** @ignore */\r\n private getClient(): Promise<Client> {\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<Client>(\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 Client {\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","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/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 { BehaviorSubject, fromEvent, Subject, Subscription } from 'rxjs';\r\nimport { map, share, tap } from 'rxjs/operators';\r\nimport { gadgets } from '@reveldigital/gadget-types';\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/** @ignore */\r\nexport interface IClient {\r\n\r\n callback(...args: any[]): void;\r\n\r\n getDeviceTime(date?: Date): Promise<string>;\r\n\r\n getDeviceTimeZoneName(): Promise<string>;\r\n\r\n getDeviceTimeZoneID(): Promise<string>;\r\n\r\n getDeviceTimeZoneOffset(): Promise<number>;\r\n\r\n getLanguageCode(): Promise<string>;\r\n\r\n getDeviceKey(): Promise<string>;\r\n\r\n sendCommand(name: string, arg: string): void;\r\n\r\n sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void;\r\n\r\n track(eventName: string, properties?: string): void;\r\n\r\n timeEvent(eventName: string): void;\r\n\r\n newEventSession(id?: string): void;\r\n\r\n getRevelRoot(): Promise<string>;\r\n\r\n getCommandMap(): Promise<string>;\r\n\r\n getDevice(): Promise<string>;\r\n\r\n finish(): void;\r\n}\r\n\r\nexport interface EventProperties {\r\n [key: string]: any;\r\n}\r\n\r\nexport interface Command {\r\n name: string;\r\n arg: string;\r\n}\r\n\r\nexport interface ILocation {\r\n latitude: number;\r\n longitude: number;\r\n city: string;\r\n state: string;\r\n address: string;\r\n country: string;\r\n postalCode: string;\r\n}\r\n\r\nexport interface IDevice {\r\n\r\n /**\r\n * Device name\r\n * \r\n * @type {string}\r\n */\r\n name: string;\r\n\r\n /**\r\n * Device key\r\n * \r\n * @type {string}\r\n */\r\n registrationKey: string;\r\n\r\n /**\r\n * Device type\r\n * \r\n * @type {string}\r\n */\r\n deviceType: string;\r\n\r\n /**\r\n * Entered service date\r\n * \r\n * @type {Date}\r\n */\r\n enteredService: Date;\r\n\r\n /**\r\n * Language code\r\n * \r\n * @type {string}\r\n */\r\n langCode?: string;\r\n\r\n /**\r\n * Time zone\r\n * \r\n * @type {string}\r\n */\r\n timeZone?: string;\r\n\r\n /**\r\n * Device properties\r\n * \r\n * @type {Array<string>}\r\n */\r\n tags: Array<string>;\r\n\r\n /**\r\n * Device location\r\n * \r\n * @type {ILocation}\r\n */\r\n location?: ILocation;\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<Command>();\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<Command>(document, 'RevelDigital.Command').pipe(\r\n map((e: any) => { return { name: e.detail.name, arg: e.detail.arg } as Command }),\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?: EventProperties): 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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"}
@@ -295,6 +295,36 @@ class PlayerClientService {
295
295
  const client = await this.getClient();
296
296
  return client instanceof NoopClient;
297
297
  }
298
+ /**
299
+ * Returns the device details associated with the player running the gadget or web app.
300
+ *
301
+ * @returns Device details.
302
+ */
303
+ async getDevice() {
304
+ const client = await this.getClient();
305
+ let obj = JSON.parse(await client.getDevice());
306
+ const device = [obj].map((device) => {
307
+ return {
308
+ name: device.name,
309
+ registrationKey: device.key,
310
+ deviceType: device.devicetype,
311
+ enteredService: new Date(device.enteredservice),
312
+ langCode: device.langcode,
313
+ timeZone: device.timezone,
314
+ tags: device.description?.split('\n'),
315
+ location: {
316
+ city: device.location?.city,
317
+ state: device.location?.state,
318
+ country: device.location?.country,
319
+ postalCode: device.location?.postalcode,
320
+ address: device.location?.address,
321
+ latitude: device.location?.latitude,
322
+ longitude: device.location?.longitude
323
+ }
324
+ };
325
+ });
326
+ return device[0];
327
+ }
298
328
  // ---
299
329
  // PRIVATE METHODS.
300
330
  // ---
@@ -392,6 +422,9 @@ class NoopClient {
392
422
  async getCommandMap() {
393
423
  return Promise.resolve('{}');
394
424
  }
425
+ async getDevice() {
426
+ return Promise.resolve(null);
427
+ }
395
428
  finish() {
396
429
  // NOOP implement, nothing to do....
397
430
  }
@@ -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 { BehaviorSubject, fromEvent, Subject, Subscription } from 'rxjs';\r\nimport { map, share, tap } from 'rxjs/operators';\r\nimport { gadgets } from '@reveldigital/gadget-types';\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: Client;\r\n}\r\n\r\n/** @ignore */\r\nexport interface Client {\r\n\r\n callback(...args: any[]): void;\r\n\r\n getDeviceTime(date?: Date): Promise<string>;\r\n\r\n getDeviceTimeZoneName(): Promise<string>;\r\n\r\n getDeviceTimeZoneID(): Promise<string>;\r\n\r\n getDeviceTimeZoneOffset(): Promise<number>;\r\n\r\n getLanguageCode(): Promise<string>;\r\n\r\n getDeviceKey(): Promise<string>;\r\n\r\n sendCommand(name: string, arg: string): void;\r\n\r\n sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void;\r\n\r\n track(eventName: string, properties?: string): void;\r\n\r\n timeEvent(eventName: string): void;\r\n\r\n newEventSession(id?: string): void;\r\n\r\n getRevelRoot(): Promise<string>;\r\n\r\n getCommandMap(): Promise<string>;\r\n\r\n finish(): void;\r\n}\r\n\r\nexport interface EventProperties {\r\n [key: string]: any;\r\n}\r\n\r\nexport interface Command {\r\n name: string;\r\n arg: string;\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<Client> | null;\r\n\r\n /**\r\n * Commands sent to this player.\r\n */\r\n public onCommand$ = new Subject<Command>();\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<Command>(document, 'RevelDigital.Command').pipe(\r\n map((e: any) => { return { name: e.detail.name, arg: e.detail.arg } as Command }),\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?: EventProperties): 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 // ---\r\n // PRIVATE METHODS.\r\n // ---\r\n /** @ignore */\r\n private getClient(): Promise<Client> {\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<Client>(\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 Client {\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","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":";;;;;;;;;;;;;MA8Da,mBAAmB;;;;;;;;;;;;IA+D9B,YAAY,IAAY;;;;QAvDjB,eAAU,GAAG,IAAI,OAAO,EAAW,CAAC;;;;QAIpC,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,CAAU,QAAQ,EAAE,sBAAsB,CAAC,CAAC,IAAI,CAC/E,GAAG,CAAC,CAAC,CAAM,OAAO,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAa,CAAA,EAAE,CAAC,EACjF,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,UAA4B;QAE1D,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;;;;;IAOO,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;;iHAtaU,mBAAmB;qHAAnB,mBAAmB,cAFlB,MAAM;4FAEP,mBAAmB;kBAH/B,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;AA6aD;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;;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/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 { BehaviorSubject, fromEvent, Subject, Subscription } from 'rxjs';\r\nimport { map, share, tap } from 'rxjs/operators';\r\nimport { gadgets } from '@reveldigital/gadget-types';\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/** @ignore */\r\nexport interface IClient {\r\n\r\n callback(...args: any[]): void;\r\n\r\n getDeviceTime(date?: Date): Promise<string>;\r\n\r\n getDeviceTimeZoneName(): Promise<string>;\r\n\r\n getDeviceTimeZoneID(): Promise<string>;\r\n\r\n getDeviceTimeZoneOffset(): Promise<number>;\r\n\r\n getLanguageCode(): Promise<string>;\r\n\r\n getDeviceKey(): Promise<string>;\r\n\r\n sendCommand(name: string, arg: string): void;\r\n\r\n sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void;\r\n\r\n track(eventName: string, properties?: string): void;\r\n\r\n timeEvent(eventName: string): void;\r\n\r\n newEventSession(id?: string): void;\r\n\r\n getRevelRoot(): Promise<string>;\r\n\r\n getCommandMap(): Promise<string>;\r\n\r\n getDevice(): Promise<string>;\r\n\r\n finish(): void;\r\n}\r\n\r\nexport interface EventProperties {\r\n [key: string]: any;\r\n}\r\n\r\nexport interface Command {\r\n name: string;\r\n arg: string;\r\n}\r\n\r\nexport interface ILocation {\r\n latitude: number;\r\n longitude: number;\r\n city: string;\r\n state: string;\r\n address: string;\r\n country: string;\r\n postalCode: string;\r\n}\r\n\r\nexport interface IDevice {\r\n\r\n /**\r\n * Device name\r\n * \r\n * @type {string}\r\n */\r\n name: string;\r\n\r\n /**\r\n * Device key\r\n * \r\n * @type {string}\r\n */\r\n registrationKey: string;\r\n\r\n /**\r\n * Device type\r\n * \r\n * @type {string}\r\n */\r\n deviceType: string;\r\n\r\n /**\r\n * Entered service date\r\n * \r\n * @type {Date}\r\n */\r\n enteredService: Date;\r\n\r\n /**\r\n * Language code\r\n * \r\n * @type {string}\r\n */\r\n langCode?: string;\r\n\r\n /**\r\n * Time zone\r\n * \r\n * @type {string}\r\n */\r\n timeZone?: string;\r\n\r\n /**\r\n * Device properties\r\n * \r\n * @type {Array<string>}\r\n */\r\n tags: Array<string>;\r\n\r\n /**\r\n * Device location\r\n * \r\n * @type {ILocation}\r\n */\r\n location?: ILocation;\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<Command>();\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<Command>(document, 'RevelDigital.Command').pipe(\r\n map((e: any) => { return { name: e.detail.name, arg: e.detail.arg } as Command }),\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?: EventProperties): 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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"}
@@ -4,10 +4,10 @@ import { gadgets } from '@reveldigital/gadget-types';
4
4
  import * as i0 from "@angular/core";
5
5
  /** @ignore */
6
6
  declare global {
7
- var Client: Client;
7
+ var Client: IClient;
8
8
  }
9
9
  /** @ignore */
10
- export interface Client {
10
+ export interface IClient {
11
11
  callback(...args: any[]): void;
12
12
  getDeviceTime(date?: Date): Promise<string>;
13
13
  getDeviceTimeZoneName(): Promise<string>;
@@ -22,6 +22,7 @@ export interface Client {
22
22
  newEventSession(id?: string): void;
23
23
  getRevelRoot(): Promise<string>;
24
24
  getCommandMap(): Promise<string>;
25
+ getDevice(): Promise<string>;
25
26
  finish(): void;
26
27
  }
27
28
  export interface EventProperties {
@@ -31,6 +32,65 @@ export interface Command {
31
32
  name: string;
32
33
  arg: string;
33
34
  }
35
+ export interface ILocation {
36
+ latitude: number;
37
+ longitude: number;
38
+ city: string;
39
+ state: string;
40
+ address: string;
41
+ country: string;
42
+ postalCode: string;
43
+ }
44
+ export interface IDevice {
45
+ /**
46
+ * Device name
47
+ *
48
+ * @type {string}
49
+ */
50
+ name: string;
51
+ /**
52
+ * Device key
53
+ *
54
+ * @type {string}
55
+ */
56
+ registrationKey: string;
57
+ /**
58
+ * Device type
59
+ *
60
+ * @type {string}
61
+ */
62
+ deviceType: string;
63
+ /**
64
+ * Entered service date
65
+ *
66
+ * @type {Date}
67
+ */
68
+ enteredService: Date;
69
+ /**
70
+ * Language code
71
+ *
72
+ * @type {string}
73
+ */
74
+ langCode?: string;
75
+ /**
76
+ * Time zone
77
+ *
78
+ * @type {string}
79
+ */
80
+ timeZone?: string;
81
+ /**
82
+ * Device properties
83
+ *
84
+ * @type {Array<string>}
85
+ */
86
+ tags: Array<string>;
87
+ /**
88
+ * Device location
89
+ *
90
+ * @type {ILocation}
91
+ */
92
+ location?: ILocation;
93
+ }
34
94
  export declare class PlayerClientService implements OnDestroy {
35
95
  /** @ignore */
36
96
  private clientPromise;
@@ -196,6 +256,12 @@ export declare class PlayerClientService implements OnDestroy {
196
256
  * @returns True if the gadget is running in preview mode, false otherwise.
197
257
  */
198
258
  isPreviewMode(): Promise<boolean>;
259
+ /**
260
+ * Returns the device details associated with the player running the gadget or web app.
261
+ *
262
+ * @returns Device details.
263
+ */
264
+ getDevice(): Promise<IDevice | null>;
199
265
  /** @ignore */
200
266
  private getClient;
201
267
  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":"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"}
1
+ {"version":3,"file":"player-client.service.d.ts","sourceRoot":"","sources":["../../../../projects/reveldigital/player-client/src/lib/player-client.service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reveldigital/player-client",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "Helper library for interfacing Angular apps with the Revel Digital player",
5
5
  "schematics": "./schematics/collection.json",
6
6
  "ng-add": {
@@ -117,12 +117,12 @@ function addPackageJsonDependencies() {
117
117
  {
118
118
  type: dependencies_1.NodeDependencyType.Dev,
119
119
  name: 'node-html-parser',
120
- version: '6.1.5',
120
+ version: '6.1.12',
121
121
  },
122
122
  {
123
123
  type: dependencies_1.NodeDependencyType.Dev,
124
124
  name: 'angular-cli-ghpages',
125
- version: '1.0.6',
125
+ version: '1.0.7',
126
126
  },
127
127
  {
128
128
  type: dependencies_1.NodeDependencyType.Dev,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../projects/reveldigital/player-client/schematics/ng-add/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../projects/reveldigital/player-client/schematics/ng-add/index.ts"],"names":[],"mappings":"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"}