UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

155 lines 20.5 kB
import { Injectable } from '@angular/core'; import { FetchClient, InventoryService } from '@c8y/client'; import { TranslateService } from '@ngx-translate/core'; import { gettext, AppStateService } from '@c8y/ngx-components'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/client"; import * as i2 from "@ngx-translate/core"; import * as i3 from "@c8y/ngx-components"; export var LoriotErrorName; (function (LoriotErrorName) { LoriotErrorName["NoDeviceProtocolsError"] = "NoDeviceProtocolsError"; LoriotErrorName["NoConnectivitySettingsError"] = "NoConnectivitySettingsError"; LoriotErrorName["ConnectivitySettingsError"] = "ConnectivitySettingsError"; LoriotErrorName["RegistrationError"] = "RegistrationError"; LoriotErrorName["DeviceProtocolsFetchError"] = "DeviceProtocolsFetchError"; LoriotErrorName["ApplicationError"] = "ApplicationError"; })(LoriotErrorName || (LoriotErrorName = {})); export class LoriotProviderService { constructor(client, inventoryService, translateService, appState) { this.client = client; this.inventoryService = inventoryService; this.translateService = translateService; this.appState = appState; this.baseUrl = '/service/loriot/'; this.registrationUrl = `${this.baseUrl}newDeviceRequest`; this.header = { 'Content-Type': 'application/json' }; this.applicationsUrl = `${this.baseUrl}applications`; } async getConnections() { const options = { method: 'GET', headers: this.header }; const res = await this.client.fetch(`${this.baseUrl}lns-connection`, options); const data = await res.json(); if (res.status === 200) { if (data.length === 0) { await this.throwNoConnectivitySettingsError(); } } else { await this.throwConnectivitySettingsError(data); } return { res, data }; } async createDevice(device) { const options = { method: 'POST', headers: this.header, body: JSON.stringify(device) }; const res = await this.client.fetch(this.registrationUrl, options); const data = await res.json(); if (res.status !== 201) { this.throwRegistrationError(data); } return { res, data }; } async getAvailableProtocols(filter = { withTotalPages: true }) { const query = { __filter: { __and: [ { __has: 'c8y_IsDeviceType' }, { type: { __in: ['c8y_LoraDeviceType', 'c8y_LpwanDeviceType'] } } ] }, __orderby: [{ name: 1 }] }; const deviceProtocolsList = await this.inventoryService.listQuery(query, filter); const { res, data } = deviceProtocolsList; if (res.status === 200) { if (data.length === 0) { this.throwNoDeviceProtocolsError(); } } else { this.throwDeviceProtocolsFetchError(); } return deviceProtocolsList; } async getApplications(connectionName) { const options = { method: 'GET', headers: this.header, params: { loriotConnectionName: connectionName } }; const res = await this.client.fetch(this.applicationsUrl, options); const data = await res.json(); /* Every connection will have atleast 1 application, so having check for this enpoint returning empty result is not needed*/ if (res.status !== 200) { this.throwApplicationError(data); } return { res, data }; } async throwNoConnectivitySettingsError() { const error = new Error(); error.name = LoriotErrorName.NoConnectivitySettingsError; const hasAdminRight = await this.appState.isApplicationAvailable('administration'); if (hasAdminRight) { error.message = this.translateService.instant(gettext(`Connectivity settings are not configured. Configure them in the Administration application under <a href="{{ link }}">Settings</a>.`), { link: '/apps/administration/index.html#/connectivitySettings/multiple_lns_connectors_loriot' }); } else { error.message = gettext('Connectivity settings are not configured. Contact the administrator.'); } throw error; } throwConnectivitySettingsError(data) { const error = new Error(); error.name = LoriotErrorName.ConnectivitySettingsError; error.message = data.message; throw error; } throwRegistrationError(data) { const error = new Error(); error.name = LoriotErrorName.RegistrationError; error.message = data.message; throw error; } throwDeviceProtocolsFetchError() { const error = new Error(); error.name = LoriotErrorName.DeviceProtocolsFetchError; error.message = gettext('Could not load device protocols.'); throw error; } throwNoDeviceProtocolsError() { const error = new Error(); error.name = LoriotErrorName.NoDeviceProtocolsError; error.message = this.translateService.instant(gettext(`No device protocols configured. Create a LoRa device protocol in <a href="{{ link }}">Device protocols</a>.`), { link: '/apps/devicemanagement/#/deviceprotocols' }); throw error; } throwApplicationError(data) { const error = new Error(); error.name = LoriotErrorName.ApplicationError; error.message = data.message; throw error; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LoriotProviderService, deps: [{ token: i1.FetchClient }, { token: i1.InventoryService }, { token: i2.TranslateService }, { token: i3.AppStateService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LoriotProviderService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LoriotProviderService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.FetchClient }, { type: i1.InventoryService }, { type: i2.TranslateService }, { type: i3.AppStateService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9yaW90LXByb3ZpZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9sb3Jpb3QtZGV2aWNlLXJlZ2lzdHJhdGlvbi9sb3Jpb3QtcHJvdmlkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxXQUFXLEVBR1gsZ0JBQWdCLEVBR2pCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7O0FBRy9ELE1BQU0sQ0FBTixJQUFZLGVBT1g7QUFQRCxXQUFZLGVBQWU7SUFDekIsb0VBQWlELENBQUE7SUFDakQsOEVBQTJELENBQUE7SUFDM0QsMEVBQXVELENBQUE7SUFDdkQsMERBQXVDLENBQUE7SUFDdkMsMEVBQXVELENBQUE7SUFDdkQsd0RBQXFDLENBQUE7QUFDdkMsQ0FBQyxFQVBXLGVBQWUsS0FBZixlQUFlLFFBTzFCO0FBS0QsTUFBTSxPQUFPLHFCQUFxQjtJQUtoQyxZQUNVLE1BQW1CLEVBQ25CLGdCQUFrQyxFQUNsQyxnQkFBa0MsRUFDbEMsUUFBeUI7UUFIekIsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUNuQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFSbEIsWUFBTyxHQUFXLGtCQUFrQixDQUFDO1FBQ3JDLG9CQUFlLEdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxrQkFBa0IsQ0FBQztRQUM1RCxXQUFNLEdBQVEsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztRQUNyRCxvQkFBZSxHQUFXLEdBQUcsSUFBSSxDQUFDLE9B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LHFCQUFxQjttSEFBckIscUJBQXFCLGNBRnBCLE1BQU07OzRGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGZXRjaENsaWVudCxcbiAgSUZldGNoT3B0aW9ucyxcbiAgSU1hbmFnZWRPYmplY3QsXG4gIEludmVudG9yeVNlcnZpY2UsXG4gIElSZXN1bHQsXG4gIElSZXN1bHRMaXN0XG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGdldHRleHQsIEFwcFN0YXRlU2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb24sIExvcmlvdERldmljZSB9IGZyb20gJy4vbG9yaW90LWRldmljZS1yZWdpc3RyYXRpb24ubW9kZWwnO1xuXG5leHBvcnQgZW51bSBMb3Jpb3RFcnJvck5hbWUge1xuICBOb0RldmljZVByb3RvY29sc0Vycm9yID0gJ05vRGV2aWNlUHJvdG9jb2xzRXJyb3InLFxuICBOb0Nvbm5lY3Rpdml0eVNldHRpbmdzRXJyb3IgPSAnTm9Db25uZWN0aXZpdHlTZXR0aW5nc0Vycm9yJyxcbiAgQ29ubmVjdGl2aXR5U2V0dGluZ3NFcnJvciA9ICdDb25uZWN0aXZpdHlTZXR0aW5nc0Vycm9yJyxcbiAgUmVnaXN0cmF0aW9uRXJyb3IgPSAnUmVnaXN0cmF0aW9uRXJyb3InLFxuICBEZXZpY2VQcm90b2NvbHNGZXRjaEVycm9yID0gJ0RldmljZVByb3RvY29sc0ZldGNoRXJyb3InLFxuICBBcHBsaWNhdGlvbkVycm9yID0gJ0FwcGxpY2F0aW9uRXJyb3InXG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIExvcmlvdFByb3ZpZGVyU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZVVybDogc3RyaW5nID0gJy9zZXJ2aWNlL2xvcmlvdC8nO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblVybDogc3RyaW5nID0gYCR7dGhpcy5iYXNlVXJsfW5ld0RldmljZVJlcXVlc3RgO1xuICBwcml2YXRlIHJlYWRvbmx5IGhlYWRlcjogYW55ID0geyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwbGljYXRpb25zVXJsOiBzdHJpbmcgPSBgJHt0aGlzLmJhc2VVcmx9YXBwbGljYXRpb25zYDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjbGllbnQ6IEZldGNoQ2xpZW50LFxuICAgIHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcHBTdGF0ZTogQXBwU3RhdGVTZXJ2aWNlXG4gICkge31cbiAgYXN5bmMgZ2V0Q29ubmVjdGlvbnMoKSB7XG4gICAgY29uc3Qgb3B0aW9uczogSUZldGNoT3B0aW9ucyA9IHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlclxuICAgIH07XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYCR7dGhpcy5iYXNlVXJsfWxucy1jb25uZWN0aW9uYCwgb3B0aW9ucyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy50aHJvd05vQ29ubmVjdGl2aXR5U2V0dGluZ3NFcnJvcigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnRocm93Q29ubmVjdGl2aXR5U2V0dGluZ3NFcnJvcihkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmVzLCBkYXRhIH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVEZXZpY2UoZGV2aWNlOiBMb3Jpb3REZXZpY2UpOiBQcm9taXNlPElSZXN1bHQ8TG9yaW90RGV2aWNlPj4ge1xuICAgIGNvbnN0IG9wdGlvbnM6IElGZXRjaE9wdGlvbnMgPSB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVyLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGV2aWNlKVxuICAgIH07XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2godGhpcy5yZWdpc3RyYXRpb25VcmwsIG9wdGlvbnMpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkge1xuICAgICAgdGhpcy50aHJvd1JlZ2lzdHJhdGlvbkVycm9yKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4geyByZXMsIGRhdGEgfTtcbiAgfVxuXG4gIGFzeW5jIGdldEF2YWlsYWJsZVByb3RvY29scyhcbiAgICBmaWx0ZXI6IG9iamVjdCA9IHsgd2l0aFRvdGFsUGFnZXM6IHRydWUgfVxuICApOiBQcm9taXNlPElSZXN1bHRMaXN0PElNYW5hZ2VkT2JqZWN0Pj4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0ge1xuICAgICAgX19maWx0ZXI6IHtcbiAgICAgICAgX19hbmQ6IFtcbiAgICAgICAgICB7IF9faGFzOiAnYzh5X0lzRGV2aWNlVHlwZScgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiB7IF9faW46IFsnYzh5X0xvcmFEZXZpY2VUeXBlJywgJ2M4eV9McHdhbkRldmljZVR5cGUnXSB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgX19vcmRlcmJ5OiBbeyBuYW1lOiAxIH1dXG4gICAgfTtcbiAgICBjb25zdCBkZXZpY2VQcm90b2NvbHNMaXN0ID0gYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmxpc3RRdWVyeShxdWVyeSwgZmlsdGVyKTtcbiAgICBjb25zdCB7IHJlcywgZGF0YSB9ID0gZGV2aWNlUHJvdG9jb2xzTGlzdDtcbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy50aHJvd05vRGV2aWNlUHJvdG9jb2xzRXJyb3IoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50aHJvd0RldmljZVByb3RvY29sc0ZldGNoRXJyb3IoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGV2aWNlUHJvdG9jb2xzTGlzdDtcbiAgfVxuXG4gIGFzeW5jIGdldEFwcGxpY2F0aW9ucyhjb25uZWN0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxBcHBsaWNhdGlvbj4+IHtcbiAgICBjb25zdCBvcHRpb25zOiBJRmV0Y2hPcHRpb25zID0ge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVyLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGxvcmlvdENvbm5lY3Rpb25OYW1lOiBjb25uZWN0aW9uTmFtZVxuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2godGhpcy5hcHBsaWNhdGlvbnNVcmwsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgLyogRXZlcnkgY29ubmVjdGlvbiB3aWxsIGhhdmUgYXRsZWFzdCAxIGFwcGxpY2F0aW9uLFxuICAgIHNvIGhhdmluZyBjaGVjayBmb3IgdGhpcyBlbnBvaW50IHJldHVybmluZyBlbXB0eSByZXN1bHQgaXMgbm90IG5lZWRlZCovXG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgdGhpcy50aHJvd0FwcGxpY2F0aW9uRXJyb3IoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB7IHJlcywgZGF0YSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0aHJvd05vQ29ubmVjdGl2aXR5U2V0dGluZ3NFcnJvcigpIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcigpO1xuICAgIGVycm9yLm5hbWUgPSBMb3Jpb3RFcnJvck5hbWUuTm9Db25uZWN0aXZpdHlTZXR0aW5nc0Vycm9yO1xuICAgIGNvbnN0IGhhc0FkbWluUmlnaHQgPSBhd2FpdCB0aGlzLmFwcFN0YXRlLmlzQXBwbGljYXRpb25BdmFpbGFibGUoJ2FkbWluaXN0cmF0aW9uJyk7XG4gICAgaWYgKGhhc0FkbWluUmlnaHQpIHtcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICBgQ29ubmVjdGl2aXR5IHNldHRpbmdzIGFyZSBub3QgY29uZmlndXJlZC4gQ29uZmlndXJlIHRoZW0gaW4gdGhlIEFkbWluaXN0cmF0aW9uIGFwcGxpY2F0aW9uIHVuZGVyIDxhIGhyZWY9XCJ7eyBsaW5rIH19XCI+U2V0dGluZ3M8L2E+LmBcbiAgICAgICAgKSxcbiAgICAgICAge1xuICAgICAgICAgIGxpbms6ICcvYXBwcy9hZG1pbmlzdHJhdGlvbi9pbmRleC5odG1sIy9jb25uZWN0aXZpdHlTZXR0aW5ncy9tdWx0aXBsZV9sbnNfY29ubmVjdG9yc19sb3Jpb3QnXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSBnZXR0ZXh0KFxuICAgICAgICAnQ29ubmVjdGl2aXR5IHNldHRpbmdzIGFyZSBub3QgY29uZmlndXJlZC4gQ29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJvd0Nvbm5lY3Rpdml0eVNldHRpbmdzRXJyb3IoZGF0YTogeyBtZXNzYWdlOiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgZXJyb3IubmFtZSA9IExvcmlvdEVycm9yTmFtZS5Db25uZWN0aXZpdHlTZXR0aW5nc0Vycm9yO1xuICAgIGVycm9yLm1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIHRocm93UmVnaXN0cmF0aW9uRXJyb3IoZGF0YTogeyBtZXNzYWdlOiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgZXJyb3IubmFtZSA9IExvcmlvdEVycm9yTmFtZS5SZWdpc3RyYXRpb25FcnJvcjtcbiAgICBlcnJvci5tZXNzYWdlID0gZGF0YS5tZXNzYWdlO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJvd0RldmljZVByb3RvY29sc0ZldGNoRXJyb3IoKSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICBlcnJvci5uYW1lID0gTG9yaW90RXJyb3JOYW1lLkRldmljZVByb3RvY29sc0ZldGNoRXJyb3I7XG4gICAgZXJyb3IubWVzc2FnZSA9IGdldHRleHQoJ0NvdWxkIG5vdCBsb2FkIGRldmljZSBwcm90b2NvbHMuJyk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIHRocm93Tm9EZXZpY2VQcm90b2NvbHNFcnJvcigpIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcigpO1xuICAgIGVycm9yLm5hbWUgPSBMb3Jpb3RFcnJvck5hbWUuTm9EZXZpY2VQcm90b2NvbHNFcnJvcjtcbiAgICBlcnJvci5tZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICBnZXR0ZXh0KFxuICAgICAgICBgTm8gZGV2aWNlIHByb3RvY29scyBjb25maWd1cmVkLiBDcmVhdGUgYSBMb1JhIGRldmljZSBwcm90b2NvbCBpbiA8YSBocmVmPVwie3sgbGluayB9fVwiPkRldmljZSBwcm90b2NvbHM8L2E+LmBcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGxpbms6ICcvYXBwcy9kZXZpY2VtYW5hZ2VtZW50LyMvZGV2aWNlcHJvdG9jb2xzJ1xuICAgICAgfVxuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIHRocm93QXBwbGljYXRpb25FcnJvcihkYXRhOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICBlcnJvci5uYW1lID0gTG9yaW90RXJyb3JOYW1lLkFwcGxpY2F0aW9uRXJyb3I7XG4gICAgZXJyb3IubWVzc2FnZSA9IGRhdGEubWVzc2FnZTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl19