@c8y/ngx-components 1021.35.2 → 1021.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/data-grid/data-grid.model.d.ts +2 -0
- package/core/data-grid/data-grid.model.d.ts.map +1 -1
- package/core/data-grid/data-grid.service.d.ts.map +1 -1
- package/device-profile/device-profile.component.d.ts +3 -1
- package/device-profile/device-profile.component.d.ts.map +1 -1
- package/device-profile/device-profile.service.d.ts +25 -0
- package/device-profile/device-profile.service.d.ts.map +1 -1
- package/device-profile/device-tab-profile/device-tab-profile.component.d.ts +7 -10
- package/device-profile/device-tab-profile/device-tab-profile.component.d.ts.map +1 -1
- package/esm2022/core/data-grid/data-grid.model.mjs +1 -1
- package/esm2022/core/data-grid/data-grid.service.mjs +5 -2
- package/esm2022/device-profile/device-profile.component.mjs +14 -10
- package/esm2022/device-profile/device-profile.service.mjs +58 -2
- package/esm2022/device-profile/device-tab-profile/device-tab-profile.component.mjs +40 -34
- package/fesm2022/c8y-ngx-components-device-profile.mjs +107 -43
- package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +4 -1
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import { InventoryService, OperationService, OperationStatus, QueriesUtil } from '@c8y/client';
|
|
3
3
|
import { AlertService, gettext } from '@c8y/ngx-components';
|
|
4
|
-
import { get, isNil, omitBy, sortBy, toArray } from 'lodash-es';
|
|
4
|
+
import { get, isEmpty, isNil, keyBy, keys, mapValues, omitBy, pickBy, sortBy, toArray, uniqBy } from 'lodash-es';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
import * as i1 from "@c8y/client";
|
|
7
7
|
import * as i2 from "@c8y/ngx-components";
|
|
@@ -23,6 +23,43 @@ export class DeviceProfileService {
|
|
|
23
23
|
}
|
|
24
24
|
return this.inventoryService.create(deviceProfile);
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Determines the available device profiles for a given device by considering device type
|
|
28
|
+
* and the supported software types declared by the devices. Because of limitations in the
|
|
29
|
+
* Inventory Query API the methods return profile that contain at least one of the supported
|
|
30
|
+
* software types and omits profiles having only non-supported software types. Resulting device
|
|
31
|
+
* profiles need to be further filtered on the client side to exclude the ones that contain
|
|
32
|
+
* non-supported software types next to the supported ones.
|
|
33
|
+
*
|
|
34
|
+
* @param device A device MO
|
|
35
|
+
* @param name Optional device profile name filter
|
|
36
|
+
* @returns Candidate device profiles that contain at least on software with supported type.
|
|
37
|
+
*/
|
|
38
|
+
getDeviceProfilesByDevice(device, name = null) {
|
|
39
|
+
const deviceTypeFilter = {
|
|
40
|
+
__or: [
|
|
41
|
+
{ 'c8y_Filter.type': device.type },
|
|
42
|
+
{ 'c8y_Filter.type': '' },
|
|
43
|
+
{ __not: { __has: 'c8y_Filter.type' } }
|
|
44
|
+
]
|
|
45
|
+
};
|
|
46
|
+
let softwareTypeFilter = {};
|
|
47
|
+
if (!isEmpty(device.c8y_SupportedSoftwareTypes)) {
|
|
48
|
+
softwareTypeFilter = {
|
|
49
|
+
__hasany: device.c8y_SupportedSoftwareTypes.map((type) => `softwareType!${type}`)
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
let query = this.queriesUtil.addAndFilter(deviceTypeFilter, softwareTypeFilter);
|
|
53
|
+
let profileNameFilter = {};
|
|
54
|
+
if (!isEmpty(name)) {
|
|
55
|
+
profileNameFilter = { name: `*${name}*` };
|
|
56
|
+
}
|
|
57
|
+
query = this.queriesUtil.addAndFilter(query, profileNameFilter);
|
|
58
|
+
return this.getDeviceProfiles(query);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* @deprecated Use `getDeviceProfilesByDevice` instead as it also considers the supported software types.
|
|
62
|
+
*/
|
|
26
63
|
getDeviceProfilesByDeviceType(deviceType) {
|
|
27
64
|
const deviceTypeFilter = {
|
|
28
65
|
__or: [
|
|
@@ -102,6 +139,25 @@ export class DeviceProfileService {
|
|
|
102
139
|
const profileConfiguration = get(selectedProfile, 'c8y_DeviceProfile.configuration');
|
|
103
140
|
return this.createProfileComparison(deviceConfiguration, profileConfiguration, 'url', null, 'type', this.getAlert('configuration'));
|
|
104
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Aligns device profile managed object's `softwareType!*` fragments to the software items
|
|
144
|
+
* included in the device profile. Removes obsolete software type fragments and adds new.
|
|
145
|
+
*
|
|
146
|
+
* @param profilePartial The device profile managed object which `softwareType!*` fragments will be adjusted.
|
|
147
|
+
* @returns The adjusted device profile managed object.
|
|
148
|
+
*/
|
|
149
|
+
alignSoftwareTypeFragments(profilePartial, profile) {
|
|
150
|
+
if (!profilePartial?.c8y_DeviceProfile?.software || !profile) {
|
|
151
|
+
return profilePartial;
|
|
152
|
+
}
|
|
153
|
+
const removedSoftwareTypes = mapValues(omitBy(profile, (_, key) => typeof key === 'string' && !key.startsWith('softwareType!')), () => null);
|
|
154
|
+
const softwareTypesToAdd = mapValues(keyBy(uniqBy(profilePartial.c8y_DeviceProfile.software, 'softwareType'), (profile) => `softwareType!${profile.softwareType}`), () => ({}));
|
|
155
|
+
const result = { ...profilePartial, ...removedSoftwareTypes, ...softwareTypesToAdd };
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
getSoftwareTypes(profile) {
|
|
159
|
+
return keys(pickBy(profile, (_, key) => typeof key === 'string' && key.startsWith('softwareType!'))).map(softwareType => softwareType.substr('softwareType!'.length));
|
|
160
|
+
}
|
|
105
161
|
getAlert(itemType) {
|
|
106
162
|
const notInstalled = (comparisionResult) => {
|
|
107
163
|
return !comparisionResult.device ? this.NOT_INSTALLED_WARNING : '';
|
|
@@ -171,4 +227,4 @@ export class DeviceProfileService {
|
|
|
171
227
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DeviceProfileService, decorators: [{
|
|
172
228
|
type: Injectable
|
|
173
229
|
}], ctorParameters: () => [{ type: i1.InventoryService }, { type: i1.OperationService }, { type: i2.AlertService }] });
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLXByb2ZpbGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldmljZS1wcm9maWxlL2RldmljZS1wcm9maWxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwsZ0JBQWdCLEVBR2hCLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsV0FBVyxFQUNaLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7QUFTaEUsTUFBTSxPQUFPLG9CQUFvQjtJQVcvQixZQUNVLGdCQUFrQyxFQUNsQyxnQkFBa0MsRUFDbEMsWUFBMEI7UUFGMUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBYjNCLGFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixXQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO1FBR2pFLDBCQUFxQixHQUFHLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQy9ELDhCQUF5QixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3hELHFCQUFnQixHQUFHLE9BQU8sQ0FDaEMsaUdBQWlHLENBQ2xHLENBQUM7UUFPQSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELG1CQUFtQixDQUFD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QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSU1hbmFnZWRPYmplY3QsXG4gIEludmVudG9yeVNlcnZpY2UsXG4gIElPcGVyYXRpb24sXG4gIElSZXN1bHRMaXN0LFxuICBPcGVyYXRpb25TZXJ2aWNlLFxuICBPcGVyYXRpb25TdGF0dXMsXG4gIFF1ZXJpZXNVdGlsXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgZ2V0dGV4dCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgZ2V0LCBpc05pbCwgb21pdEJ5LCBzb3J0QnksIHRvQXJyYXkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtcbiAgQ29tcGFyaXNvblJlc3VsdCxcbiAgRGV2aWNlUHJvZmlsZSxcbiAgRGV2aWNlUHJvZmlsZUZpcm13YXJlLFxuICBEZXZpY2VQcm9maWxlU29mdHdhcmVcbn0gZnJvbSAnLi9kZXZpY2UtcHJvZmlsZS5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZXZpY2VQcm9maWxlU2VydmljZSB7XG4gIHJlYWRvbmx5IGRhdGVGcm9tID0gbmV3IERhdGUoMCk7XG4gIHJlYWRvbmx5IGRhdGVUbyA9IG5ldyBEYXRlKERhdGUubm93KCkgKyA4NjQwMDAwMCk7IC8vIDEgZGF5IGluIHRoZSBmdXR1cmVcbiAgcHJpdmF0ZSBxdWVyaWVzVXRpbDogUXVlcmllc1V0aWw7XG5cbiAgcHJpdmF0ZSBOT1RfSU5TVEFMTEVEX1dBUk5JTkcgPSBnZXR0ZXh0KCdOb3QgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2UnKTtcbiAgcHJpdmF0ZSBWRVJTSU9OX01JU1NNQVRDSF9XQVJOSU5HID0gZ2V0dGV4dCgnVmVyc2lvbiBtaXNtYXRjaCcpO1xuICBwcml2YXRlIFNBTUVfVVJMX1dBUk5JTkcgPSBnZXR0ZXh0KFxuICAgICdJbnN0YWxsZWQgY29uZmlndXJhdGlvbiBoYXMgdGhlIHNhbWUgVVJMIGJ1dCBkaWZmZXJlbnQgbmFtZSBvciB0eXBlIHRoYW4gdGhlIG9uZSBpbiB0aGUgcHJvZmlsZSdcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvcGVyYXRpb25TZXJ2aWNlOiBPcGVyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5xdWVyaWVzVXRpbCA9IG5ldyBRdWVyaWVzVXRpbCgpO1xuICB9XG5cbiAgY3JlYXRlRGV2aWNlUHJvZmlsZShkZXZpY2VQcm9maWxlOiBQYXJ0aWFsPERldmljZVByb2ZpbGU+KSB7XG4gICAgaWYgKGdldChkZXZpY2VQcm9maWxlLCAnYzh5X0ZpbHRlci50eXBlJykgPT09ICcnKSB7XG4gICAgICBkZWxldGUgZGV2aWNlUHJvZmlsZS5jOHlfRmlsdGVyLnR5cGU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmludmVudG9yeVNlcnZpY2UuY3JlYXRlKGRldmljZVByb2ZpbGUgYXMgSU1hbmFnZWRPYmplY3QpO1xuICB9XG5cbiAgZ2V0RGV2aWNlUHJvZmlsZXNCeURldmljZVR5cGUoZGV2aWNlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4+IHtcbiAgICBjb25zdCBkZXZpY2VUeXBlRmlsdGVyID0ge1xuICAgICAgX19vcjogW1xuICAgICAgICB7ICdjOHlfRmlsdGVyLnR5cGUnOiBkZXZpY2VUeXBlIH0sXG4gICAgICAgIHsgJ2M4eV9GaWx0ZXIudHlwZSc6ICcnIH0sXG4gICAgICAgIHsgX19ub3Q6IHsgX19oYXM6ICdjOHlfRmlsdGVyLnR5cGUnIH0gfVxuICAgICAgXVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGV2aWNlUHJvZmlsZXMoZGV2aWNlVHlwZUZpbHRlcik7XG4gIH1cblxuICBnZXREZXZpY2VQcm9maWxlcyhhbmRRdWVyeT86IGFueSk6IFByb21pc2U8SVJlc3VsdExpc3Q8SU1hbmFnZWRPYmplY3Q+PiB7XG4gICAgbGV0IHF1ZXJ5OiBvYmplY3QgPSB7XG4gICAgICB0eXBlOiAnYzh5X1Byb2ZpbGUnXG4gICAgfTtcbiAgICBjb25zdCBmaWx0ZXI6IG9iamVjdCA9IHtcbiAgICAgIHBhZ2VTaXplOiAxMDAsXG4gICAgICB3aXRoVG90YWxQYWdlczogdHJ1ZVxuICAgIH07XG4gICAgcXVlcnkgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihxdWVyeSwgYW5kUXVlcnkgfHwge30pO1xuICAgIHJldHVybiB0aGlzLmludmVudG9yeVNlcnZpY2UubGlzdFF1ZXJ5KHF1ZXJ5LCBmaWx0ZXIpO1xuICB9XG5cbiAgYXN5bmMgZ2V0UHJvZmlsZU9wZXJhdGlvbihkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgY29uc3QgZmlsdGVyOiBvYmplY3QgPSB7XG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGZyYWdtZW50VHlwZTogJ2M4eV9EZXZpY2VQcm9maWxlJyxcbiAgICAgIGRhdGVGcm9tOiB0aGlzLmRhdGVGcm9tLnRvSVNPU3RyaW5nKCksXG4gICAgICBkYXRlVG86IHRoaXMuZGF0ZVRvLnRvSVNPU3RyaW5nKCksXG4gICAgICByZXZlcnQ6IHRydWUsXG4gICAgICBwYWdlU2l6ZTogMVxuICAgIH07XG5cbiAgICBjb25zdCBvcGVyYXRpb24gPSAoYXdhaXQgdGhpcy5vcGVyYXRpb25TZXJ2aWNlLmxpc3QoZmlsdGVyKSkuZGF0YVswXTtcbiAgICByZXR1cm4gb3BlcmF0aW9uICYmIG9wZXJhdGlvbi5zdGF0dXMgIT09IE9wZXJhdGlvblN0YXR1cy5TVUNDRVNTRlVMID8gb3BlcmF0aW9uIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUHJvZmlsZU9wZXJhdGlvbihkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LCBkZXZpY2VQcm9maWxlOiBQYXJ0aWFsPERldmljZVByb2ZpbGU+KSB7XG4gICAgbGV0IG9wZXJhdGlvbjtcbiAgICBjb25zdCBvcGVyYXRpb25DZmc6IElPcGVyYXRpb24gPSB7XG4gICAgICBkZXZpY2VJZDogZGV2aWNlLmlkLFxuICAgICAgcHJvZmlsZUlkOiBkZXZpY2VQcm9maWxlLmlkLFxuICAgICAgcHJvZmlsZU5hbWU6IGRldmljZVByb2ZpbGUubmFtZSxcbiAgICAgIGM4eV9EZXZpY2VQcm9maWxlOiBkZXZpY2VQcm9maWxlLmM4eV9EZXZpY2VQcm9maWxlLFxuICAgICAgZGVzY3JpcHRpb246IGBBc3NpZ24gZGV2aWNlIHByb2ZpbGUgJHtkZXZpY2VQcm9maWxlLm5hbWV9IHRvIGRldmljZSAke2RldmljZS5uYW1lfWBcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMub3BlcmF0aW9uU2VydmljZS5jcmVhdGUob3BlcmF0aW9uQ2ZnKTtcbiAgICAgIG9wZXJhdGlvbiA9IGRhdGE7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH1cbiAgICByZXR1cm4gb3BlcmF0aW9uO1xuICB9XG5cbiAgZ2V0RmlybXdhcmVJdGVtcyhcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LFxuICAgIHNlbGVjdGVkUHJvZmlsZTogUGFydGlhbDxEZXZpY2VQcm9maWxlPlxuICApOiBDb21wYXJpc29uUmVzdWx0W10ge1xuICAgIGNvbnN0IGRldmljZUZpcm13YXJlID0gZGV2aWNlLmM4eV9GaXJtd2FyZTtcbiAgICBjb25zdCBwcm9maWxlRmlybXdhcmUgPSBnZXQoc2VsZWN0ZWRQcm9maWxlLCAnYzh5X0RldmljZVByb2ZpbGUuZmlybXdhcmUnKTtcbiAgICBjb25zdCBkZXZpY2VJdGVtcyA9IFtdO1xuICAgIGNvbnN0IHByb2ZpbGVJdGVtcyA9IFtdO1xuXG4gICAgaWYgKGRldmljZUZpcm13YXJlKSB7XG4gICAgICBkZXZpY2VJdGVtcy5wdXNoKGRldmljZUZpcm13YXJlKTtcbiAgICB9XG4gICAgaWYgKHByb2ZpbGVGaXJtd2FyZSkge1xuICAgICAgcHJvZmlsZUl0ZW1zLnB1c2gocHJvZmlsZUZpcm13YXJlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUHJvZmlsZUNvbXBhcmlzb24oXG4gICAgICBkZXZpY2VJdGVtcyxcbiAgICAgIHByb2ZpbGVJdGVtcyxcbiAgICAgICduYW1lJyxcbiAgICAgICd2ZXJzaW9uJyxcbiAgICAgIG51bGwsXG4gICAgICB0aGlzLmdldEFsZXJ0KCdmaXJtd2FyZScpXG4gICAgKTtcbiAgfVxuXG4gIGdldFNvZnR3YXJlSXRlbXMoXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBzZWxlY3RlZFByb2ZpbGU6IFBhcnRpYWw8RGV2aWNlUHJvZmlsZT5cbiAgKTogQ29tcGFyaXNvblJlc3VsdFtdIHtcbiAgICBjb25zdCBkZXZpY2VTb2Z0d2FyZSA9IGRldmljZS5jOHlfU29mdHdhcmVMaXN0O1xuICAgIGNvbnN0IHByb2ZpbGVTb2Z0d2FyZSA9IGdldChzZWxlY3RlZFByb2ZpbGUsICdjOHlfRGV2aWNlUHJvZmlsZS5zb2Z0d2FyZScpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVByb2ZpbGVDb21wYXJpc29uKFxuICAgICAgZGV2aWNlU29mdHdhcmUsXG4gICAgICBwcm9maWxlU29mdHdhcmUsXG4gICAgICAnbmFtZScsXG4gICAgICAndmVyc2lvbicsXG4gICAgICAnc29mdHdhcmVUeXBlJyxcbiAgICAgIHRoaXMuZ2V0QWxlcnQoJ3NvZnR3YXJlJylcbiAgICApO1xuICB9XG5cbiAgZ2V0Q29uZmlndXJhdGlvbkl0ZW1zKFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3QsXG4gICAgc2VsZWN0ZWRQcm9maWxlOiBQYXJ0aWFsPERldmljZVByb2ZpbGU+XG4gICk6IENvbXBhcmlzb25SZXN1bHRbXSB7XG4gICAgY29uc3QgZGV2aWNlQ29uZmlndXJhdGlvbiA9IFtdO1xuICAgIE9iamVjdC5rZXlzKGRldmljZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKGtleS5zbGljZSgwLCAxOCkgPT09ICdjOHlfQ29uZmlndXJhdGlvbl8nKSB7XG4gICAgICAgIGRldmljZUNvbmZpZ3VyYXRpb24ucHVzaChkZXZpY2Vba2V5XSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvZmlsZUNvbmZpZ3VyYXRpb24gPSBnZXQoc2VsZWN0ZWRQcm9maWxlLCAnYzh5X0RldmljZVByb2ZpbGUuY29uZmlndXJhdGlvbicpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVByb2ZpbGVDb21wYXJpc29uKFxuICAgICAgZGV2aWNlQ29uZmlndXJhdGlvbixcbiAgICAgIHByb2ZpbGVDb25maWd1cmF0aW9uLFxuICAgICAgJ3VybCcsXG4gICAgICBudWxsLFxuICAgICAgJ3R5cGUnLFxuICAgICAgdGhpcy5nZXRBbGVydCgnY29uZmlndXJhdGlvbicpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWxlcnQoaXRlbVR5cGU6IHN0cmluZyk6IChjb21wYXJpc2lvblJlc3VsdDogQ29tcGFyaXNvblJlc3VsdCkgPT4gc3RyaW5nIHtcbiAgICBjb25zdCBub3RJbnN0YWxsZWQgPSAoY29tcGFyaXNpb25SZXN1bHQ6IENvbXBhcmlzb25SZXN1bHQpID0+IHtcbiAgICAgIHJldHVybiAhY29tcGFyaXNpb25SZXN1bHQuZGV2aWNlID8gdGhpcy5OT1RfSU5TVEFMTEVEX1dBUk5JTkcgOiAnJztcbiAgICB9O1xuXG4gICAgc3dpdGNoIChpdGVtVHlwZSkge1xuICAgICAgY2FzZSAnZmlybXdhcmUnOlxuICAgICAgY2FzZSAnc29mdHdhcmUnOlxuICAgICAgICByZXR1cm4gKGNvbXBhcmlzaW9uUmVzdWx0OiBDb21wYXJpc29uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmlzaW9uUmVzdWx0LmRldmljZSAmJlxuICAgICAgICAgICAgY29tcGFyaXNpb25SZXN1bHQucHJvZmlsZSAmJlxuICAgICAgICAgICAgY29tcGFyaXNpb25SZXN1bHQuZGV2aWNlLml0ZW1EZXRhaWxzICE9PSBjb21wYXJpc2lvblJlc3VsdC5wcm9maWxlLml0ZW1EZXRhaWxzXG4gICAgICAgICAgICA/IHRoaXMuVkVSU0lPTl9NSVNTTUFUQ0hfV0FSTklOR1xuICAgICAgICAgICAgOiBub3RJbnN0YWxsZWQoY29tcGFyaXNpb25SZXN1bHQpO1xuICAgICAgICB9O1xuICAgICAgY2FzZSAnY29uZmlndXJhdGlvbic6XG4gICAgICAgIHJldHVybiAoY29tcGFyaXNpb25SZXN1bHQ6IENvbXBhcmlzb25SZXN1bHQpID0+IHtcbiAgICAgICAgICByZXR1cm4gY29tcGFyaXNpb25SZXN1bHQuZGV2aWNlICYmXG4gICAgICAgICAgICBjb21wYXJpc2lvblJlc3VsdC5wcm9maWxlICYmXG4gICAgICAgICAgICAoY29tcGFyaXNpb25SZXN1bHQuZGV2aWNlLml0ZW1OYW1lICE9PSBjb21wYXJpc2lvblJlc3VsdC5wcm9maWxlLml0ZW1OYW1lIHx8XG4gICAgICAgICAgICAgIGNvbXBhcmlzaW9uUmVzdWx0LmRldmljZS5pdGVtRGV0YWlscyAhPT0gY29tcGFyaXNpb25SZXN1bHQucHJvZmlsZS5pdGVtRGV0YWlscylcbiAgICAgICAgICAgID8gdGhpcy5TQU1FX1VSTF9XQVJOSU5HXG4gICAgICAgICAgICA6IG5vdEluc3RhbGxlZChjb21wYXJpc2lvblJlc3VsdCk7XG4gICAgICAgIH07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbm90SW5zdGFsbGVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUHJvZmlsZUNvbXBhcmlzb24oXG4gICAgZGV2aWNlSXRlbXM6IGFueVtdID0gW10sXG4gICAgcHJvZmlsZUl0ZW1zOiBBcnJheTxEZXZpY2VQcm9maWxlU29mdHdhcmUgfCBEZXZpY2VQcm9maWxlRmlybXdhcmU+ID0gW10sXG4gICAgbWVyZ2VCeVByb3BlcnR5OiBzdHJpbmcsXG4gICAgcHJvcGVydHlOYW1lV2l0aERldGFpbHM6IHN0cmluZyxcbiAgICBwcm9wZXJ0eU5hbWVXaXRoVHlwZTogc3RyaW5nLFxuICAgIGdldEFsZXJ0OiAoY29tcGFyaXNpb25SZXN1bHQ6IENvbXBhcmlzb25SZXN1bHQpID0+IHN0cmluZ1xuICApOiBDb21wYXJpc29uUmVzdWx0W10ge1xuICAgIGNvbnN0IGNvbXBhcmlzb25PYmogPSB0aGlzLmNyZWF0ZVByb2ZpbGVDb21wYXJpc29uRnJvbURldmljZUl0ZW1zKFxuICAgICAgZGV2aWNlSXRlbXMsXG4gICAgICBtZXJnZUJ5UHJvcGVydHksXG4gICAgICBwcm9wZXJ0eU5hbWVXaXRoRGV0YWlscyxcbiAgICAgIHByb3BlcnR5TmFtZVdpdGhUeXBlXG4gICAgKTtcbiAgICBjb25zdCBleHRlbmRlZENvbXBhcmlzb25PYmogPSB0aGlzLmV4dGVuZFByb2ZpbGVDb21wYXJpc29uV2l0aFByb2ZpbGVJdGVtcyhcbiAgICAgIGNvbXBhcmlzb25PYmosXG4gICAgICBwcm9maWxlSXRlbXMsXG4gICAgICBtZXJnZUJ5UHJvcGVydHksXG4gICAgICBwcm9wZXJ0eU5hbWVXaXRoRGV0YWlscyxcbiAgICAgIHByb3BlcnR5TmFtZVdpdGhUeXBlLFxuICAgICAgZ2V0QWxlcnRcbiAgICApO1xuICAgIHJldHVybiBzb3J0QnkodG9BcnJheShleHRlbmRlZENvbXBhcmlzb25PYmopLCAnbmFtZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQcm9maWxlQ29tcGFyaXNvbkZyb21EZXZpY2VJdGVtcyhcbiAgICBkZXZpY2VJdGVtczogYW55W10sXG4gICAgbWVyZ2VCeVByb3BlcnR5OiBzdHJpbmcsXG4gICAgcHJvcGVydHlOYW1lV2l0aERldGFpbHM6IHN0cmluZyxcbiAgICBwcm9wZXJ0eU5hbWVXaXRoVHlwZTogc3RyaW5nXG4gICk6IGFueSB7XG4gICAgcmV0dXJuIGRldmljZUl0ZW1zLnJlZHVjZShcbiAgICAgIChjb21hcHJpdGlvbkl0ZW0sIGRldmljZUl0ZW0pID0+XG4gICAgICAgIE9iamVjdC5hc3NpZ24oY29tYXByaXRpb25JdGVtLCB7XG4gICAgICAgICAgW2RldmljZUl0ZW1bbWVyZ2VCeVByb3BlcnR5XV06IHtcbiAgICAgICAgICAgIGRldmljZTogb21pdEJ5KFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaXRlbU5hbWU6IGRldmljZUl0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICBpdGVtRGV0YWlsczogZGV2aWNlSXRlbVtwcm9wZXJ0eU5hbWVXaXRoRGV0YWlsc10sXG4gICAgICAgICAgICAgICAgaXRlbVR5cGU6IGRldmljZUl0ZW1bcHJvcGVydHlOYW1lV2l0aFR5cGVdLFxuICAgICAgICAgICAgICAgIGl0ZW1Vcmw6IGRldmljZUl0ZW0udXJsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGlzTmlsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgcHJvZmlsZTogdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0ZW5kUHJvZmlsZUNvbXBhcmlzb25XaXRoUHJvZmlsZUl0ZW1zKFxuICAgIGNvbXBhcmlzb25PYmo6IG9iamVjdCxcbiAgICBwcm9maWxlSXRlbXM6IEFycmF5PERldmljZVByb2ZpbGVTb2Z0d2FyZSB8IERldmljZVByb2ZpbGVGaXJtd2FyZT4sXG4gICAgbWVyZ2VCeVByb3BlcnR5OiBzdHJpbmcsXG4gICAgcHJvcGVydHlOYW1lV2l0aERldGFpbHM6IHN0cmluZyxcbiAgICBwcm9wZXJ0eU5hbWVXaXRoVHlwZTogc3RyaW5nLFxuICAgIGdldEFsZXJ0OiAoY29tcGFyaXNpb25SZXN1bHQ6IENvbXBhcmlzb25SZXN1bHQpID0+IHN0cmluZ1xuICApIHtcbiAgICBwcm9maWxlSXRlbXMuZm9yRWFjaChwcm9maWxlSXRlbSA9PiB7XG4gICAgICBjb25zdCBjb21wYXJpc2lvblJlc3VsdDogQ29tcGFyaXNvblJlc3VsdCA9IHtcbiAgICAgICAgcHJvZmlsZTogb21pdEJ5KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGl0ZW1OYW1lOiBwcm9maWxlSXRlbS5uYW1lLFxuICAgICAgICAgICAgaXRlbURldGFpbHM6IHByb2ZpbGVJdGVtW3Byb3BlcnR5TmFtZVdpdGhEZXRhaWxzXSxcbiAgICAgICAgICAgIGl0ZW1UeXBlOiBwcm9maWxlSXRlbVtwcm9wZXJ0eU5hbWVXaXRoVHlwZV0sXG4gICAgICAgICAgICBpdGVtVXJsOiBwcm9maWxlSXRlbS51cmxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGlzTmlsXG4gICAgICAgICksXG4gICAgICAgIGRldmljZTogY29tcGFyaXNvbk9ialtwcm9maWxlSXRlbVttZXJnZUJ5UHJvcGVydHldXVxuICAgICAgICAgID8gY29tcGFyaXNvbk9ialtwcm9maWxlSXRlbVttZXJnZUJ5UHJvcGVydHldXS5kZXZpY2VcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIGNvbXBhcmlzaW9uUmVzdWx0LmNvbXBhcmlzb25BbGVydCA9IGdldEFsZXJ0KGNvbXBhcmlzaW9uUmVzdWx0KTtcbiAgICAgIGNvbXBhcmlzb25PYmpbcHJvZmlsZUl0ZW1bbWVyZ2VCeVByb3BlcnR5XV0gPSBjb21wYXJpc2lvblJlc3VsdDtcbiAgICB9KTtcbiAgICByZXR1cm4gY29tcGFyaXNvbk9iajtcbiAgfVxufVxuIl19
|
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLXByb2ZpbGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldmljZS1wcm9maWxlL2RldmljZS1wcm9maWxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwsZ0JBQWdCLEVBR2hCLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsV0FBVyxFQUNaLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUNMLEdBQUcsRUFDSCxPQUFPLEVBQ1AsS0FBSyxFQUNMLEtBQUssRUFDTCxJQUFJLEVBQ0osU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ04sTUFBTSxFQUNOLE9BQU8sRUFDUCxNQUFNLEVBQ1AsTUFBTSxXQUFXLENBQUM7Ozs7QUFTbkIsTUFBTSxPQUFPLG9CQUFvQjtJQVcvQixZQUNVLGdCQUFrQyxFQUNsQyxnQkFBa0MsRUFDbEMsWUFBMEI7UUFGMUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBYjNCLGFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixXQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO1FBR2pFLDBCQUFxQixHQUFHLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQy9ELDhCQUF5QixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3hELHFCQUFnQixHQUFHLE9BQU8sQ0FDaEMsaUdBQWlHLENBQ2xHLENBQUM7UUFPQSxJQUFJLENB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OzsyRkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSU1hbmFnZWRPYmplY3QsXG4gIEludmVudG9yeVNlcnZpY2UsXG4gIElPcGVyYXRpb24sXG4gIElSZXN1bHRMaXN0LFxuICBPcGVyYXRpb25TZXJ2aWNlLFxuICBPcGVyYXRpb25TdGF0dXMsXG4gIFF1ZXJpZXNVdGlsXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgZ2V0dGV4dCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgZ2V0LFxuICBpc0VtcHR5LFxuICBpc05pbCxcbiAga2V5QnksXG4gIGtleXMsXG4gIG1hcFZhbHVlcyxcbiAgb21pdEJ5LFxuICBwaWNrQnksXG4gIHNvcnRCeSxcbiAgdG9BcnJheSxcbiAgdW5pcUJ5XG59IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQge1xuICBDb21wYXJpc29uUmVzdWx0LFxuICBEZXZpY2VQcm9maWxlLFxuICBEZXZpY2VQcm9maWxlRmlybXdhcmUsXG4gIERldmljZVByb2ZpbGVTb2Z0d2FyZVxufSBmcm9tICcuL2RldmljZS1wcm9maWxlLm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERldmljZVByb2ZpbGVTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgZGF0ZUZyb20gPSBuZXcgRGF0ZSgwKTtcbiAgcmVhZG9ubHkgZGF0ZVRvID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDg2NDAwMDAwKTsgLy8gMSBkYXkgaW4gdGhlIGZ1dHVyZVxuICBwcml2YXRlIHF1ZXJpZXNVdGlsOiBRdWVyaWVzVXRpbDtcblxuICBwcml2YXRlIE5PVF9JTlNUQUxMRURfV0FSTklORyA9IGdldHRleHQoJ05vdCBpbnN0YWxsZWQgb24gdGhlIGRldmljZScpO1xuICBwcml2YXRlIFZFUlNJT05fTUlTU01BVENIX1dBUk5JTkcgPSBnZXR0ZXh0KCdWZXJzaW9uIG1pc21hdGNoJyk7XG4gIHByaXZhdGUgU0FNRV9VUkxfV0FSTklORyA9IGdldHRleHQoXG4gICAgJ0luc3RhbGxlZCBjb25maWd1cmF0aW9uIGhhcyB0aGUgc2FtZSBVUkwgYnV0IGRpZmZlcmVudCBuYW1lIG9yIHR5cGUgdGhhbiB0aGUgb25lIGluIHRoZSBwcm9maWxlJ1xuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIG9wZXJhdGlvblNlcnZpY2U6IE9wZXJhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZVxuICApIHtcbiAgICB0aGlzLnF1ZXJpZXNVdGlsID0gbmV3IFF1ZXJpZXNVdGlsKCk7XG4gIH1cblxuICBjcmVhdGVEZXZpY2VQcm9maWxlKGRldmljZVByb2ZpbGU6IFBhcnRpYWw8RGV2aWNlUHJvZmlsZT4pIHtcbiAgICBpZiAoZ2V0KGRldmljZVByb2ZpbGUsICdjOHlfRmlsdGVyLnR5cGUnKSA9PT0gJycpIHtcbiAgICAgIGRlbGV0ZSBkZXZpY2VQcm9maWxlLmM4eV9GaWx0ZXIudHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW52ZW50b3J5U2VydmljZS5jcmVhdGUoZGV2aWNlUHJvZmlsZSBhcyBJTWFuYWdlZE9iamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgYXZhaWxhYmxlIGRldmljZSBwcm9maWxlcyBmb3IgYSBnaXZlbiBkZXZpY2UgYnkgY29uc2lkZXJpbmcgZGV2aWNlIHR5cGVcbiAgICogYW5kIHRoZSBzdXBwb3J0ZWQgc29mdHdhcmUgdHlwZXMgZGVjbGFyZWQgYnkgdGhlIGRldmljZXMuIEJlY2F1c2Ugb2YgbGltaXRhdGlvbnMgaW4gdGhlXG4gICAqIEludmVudG9yeSBRdWVyeSBBUEkgdGhlIG1ldGhvZHMgcmV0dXJuIHByb2ZpbGUgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3VwcG9ydGVkXG4gICAqIHNvZnR3YXJlIHR5cGVzIGFuZCBvbWl0cyBwcm9maWxlcyBoYXZpbmcgb25seSBub24tc3VwcG9ydGVkIHNvZnR3YXJlIHR5cGVzLiBSZXN1bHRpbmcgZGV2aWNlXG4gICAqIHByb2ZpbGVzIG5lZWQgdG8gYmUgZnVydGhlciBmaWx0ZXJlZCBvbiB0aGUgY2xpZW50IHNpZGUgdG8gZXhjbHVkZSB0aGUgb25lcyB0aGF0IGNvbnRhaW5cbiAgICogbm9uLXN1cHBvcnRlZCBzb2Z0d2FyZSB0eXBlcyBuZXh0IHRvIHRoZSBzdXBwb3J0ZWQgb25lcy5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZSBBIGRldmljZSBNT1xuICAgKiBAcGFyYW0gbmFtZSBPcHRpb25hbCBkZXZpY2UgcHJvZmlsZSBuYW1lIGZpbHRlclxuICAgKiBAcmV0dXJucyBDYW5kaWRhdGUgZGV2aWNlIHByb2ZpbGVzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbiBzb2Z0d2FyZSB3aXRoIHN1cHBvcnRlZCB0eXBlLlxuICAgKi9cbiAgZ2V0RGV2aWNlUHJvZmlsZXNCeURldmljZShcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGxcbiAgKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4+IHtcbiAgICBjb25zdCBkZXZpY2VUeXBlRmlsdGVyID0ge1xuICAgICAgX19vcjogW1xuICAgICAgICB7ICdjOHlfRmlsdGVyLnR5cGUnOiBkZXZpY2UudHlwZSB9LFxuICAgICAgICB7ICdjOHlfRmlsdGVyLnR5cGUnOiAnJyB9LFxuICAgICAgICB7IF9fbm90OiB7IF9faGFzOiAnYzh5X0ZpbHRlci50eXBlJyB9IH1cbiAgICAgIF1cbiAgICB9O1xuXG4gICAgbGV0IHNvZnR3YXJlVHlwZUZpbHRlciA9IHt9O1xuICAgIGlmICghaXNFbXB0eShkZXZpY2UuYzh5X1N1cHBvcnRlZFNvZnR3YXJlVHlwZXMpKSB7XG4gICAgICBzb2Z0d2FyZVR5cGVGaWx0ZXIgPSB7XG4gICAgICAgIF9faGFzYW55OiBkZXZpY2UuYzh5X1N1cHBvcnRlZFNvZnR3YXJlVHlwZXMubWFwKCh0eXBlOiBzdHJpbmcpID0+IGBzb2Z0d2FyZVR5cGUhJHt0eXBlfWApXG4gICAgICB9O1xuICAgIH1cbiAgICBsZXQgcXVlcnkgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihkZXZpY2VUeXBlRmlsdGVyLCBzb2Z0d2FyZVR5cGVGaWx0ZXIpO1xuXG4gICAgbGV0IHByb2ZpbGVOYW1lRmlsdGVyID0ge307XG4gICAgaWYgKCFpc0VtcHR5KG5hbWUpKSB7XG4gICAgICBwcm9maWxlTmFtZUZpbHRlciA9IHsgbmFtZTogYCoke25hbWV9KmAgfTtcbiAgICB9XG4gICAgcXVlcnkgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihxdWVyeSwgcHJvZmlsZU5hbWVGaWx0ZXIpO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGV2aWNlUHJvZmlsZXMocXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgZ2V0RGV2aWNlUHJvZmlsZXNCeURldmljZWAgaW5zdGVhZCBhcyBpdCBhbHNvIGNvbnNpZGVycyB0aGUgc3VwcG9ydGVkIHNvZnR3YXJlIHR5cGVzLlxuICAgKi9cbiAgZ2V0RGV2aWNlUHJvZmlsZXNCeURldmljZVR5cGUoZGV2aWNlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4+IHtcbiAgICBjb25zdCBkZXZpY2VUeXBlRmlsdGVyID0ge1xuICAgICAgX19vcjogW1xuICAgICAgICB7ICdjOHlfRmlsdGVyLnR5cGUnOiBkZXZpY2VUeXBlIH0sXG4gICAgICAgIHsgJ2M4eV9GaWx0ZXIudHlwZSc6ICcnIH0sXG4gICAgICAgIHsgX19ub3Q6IHsgX19oYXM6ICdjOHlfRmlsdGVyLnR5cGUnIH0gfVxuICAgICAgXVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGV2aWNlUHJvZmlsZXMoZGV2aWNlVHlwZUZpbHRlcik7XG4gIH1cblxuICBnZXREZXZpY2VQcm9maWxlcyhhbmRRdWVyeT86IGFueSk6IFByb21pc2U8SVJlc3VsdExpc3Q8SU1hbmFnZWRPYmplY3Q+PiB7XG4gICAgbGV0IHF1ZXJ5OiBvYmplY3QgPSB7XG4gICAgICB0eXBlOiAnYzh5X1Byb2ZpbGUnXG4gICAgfTtcbiAgICBjb25zdCBmaWx0ZXI6IG9iamVjdCA9IHtcbiAgICAgIHBhZ2VTaXplOiAxMDAsXG4gICAgICB3aXRoVG90YWxQYWdlczogdHJ1ZVxuICAgIH07XG4gICAgcXVlcnkgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihxdWVyeSwgYW5kUXVlcnkgfHwge30pO1xuICAgIHJldHVybiB0aGlzLmludmVudG9yeVNlcnZpY2UubGlzdFF1ZXJ5KHF1ZXJ5LCBmaWx0ZXIpO1xuICB9XG5cbiAgYXN5bmMgZ2V0UHJvZmlsZU9wZXJhdGlvbihkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgY29uc3QgZmlsdGVyOiBvYmplY3QgPSB7XG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGZyYWdtZW50VHlwZTogJ2M4eV9EZXZpY2VQcm9maWxlJyxcbiAgICAgIGRhdGVGcm9tOiB0aGlzLmRhdGVGcm9tLnRvSVNPU3RyaW5nKCksXG4gICAgICBkYXRlVG86IHRoaXMuZGF0ZVRvLnRvSVNPU3RyaW5nKCksXG4gICAgICByZXZlcnQ6IHRydWUsXG4gICAgICBwYWdlU2l6ZTogMVxuICAgIH07XG5cbiAgICBjb25zdCBvcGVyYXRpb24gPSAoYXdhaXQgdGhpcy5vcGVyYXRpb25TZXJ2aWNlLmxpc3QoZmlsdGVyKSkuZGF0YVswXTtcbiAgICByZXR1cm4gb3BlcmF0aW9uICYmIG9wZXJhdGlvbi5zdGF0dXMgIT09IE9wZXJhdGlvblN0YXR1cy5TVUNDRVNTRlVMID8gb3BlcmF0aW9uIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUHJvZmlsZU9wZXJhdGlvbihkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LCBkZXZpY2VQcm9maWxlOiBQYXJ0aWFsPERldmljZVByb2ZpbGU+KSB7XG4gICAgbGV0IG9wZXJhdGlvbjtcbiAgICBjb25zdCBvcGVyYXRpb25DZmc6IElPcGVyYXRpb24gPSB7XG4gICAgICBkZXZpY2VJZDogZGV2aWNlLmlkLFxuICAgICAgcHJvZmlsZUlkOiBkZXZpY2VQcm9maWxlLmlkLFxuICAgICAgcHJvZmlsZU5hbWU6IGRldmljZVByb2ZpbGUubmFtZSxcbiAgICAgIGM4eV9EZXZpY2VQcm9maWxlOiBkZXZpY2VQcm9maWxlLmM4eV9EZXZpY2VQcm9maWxlLFxuICAgICAgZGVzY3JpcHRpb246IGBBc3NpZ24gZGV2aWNlIHByb2ZpbGUgJHtkZXZpY2VQcm9maWxlLm5hbWV9IHRvIGRldmljZSAke2RldmljZS5uYW1lfWBcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMub3BlcmF0aW9uU2VydmljZS5jcmVhdGUob3BlcmF0aW9uQ2ZnKTtcbiAgICAgIG9wZXJhdGlvbiA9IGRhdGE7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH1cbiAgICByZXR1cm4gb3BlcmF0aW9uO1xuICB9XG5cbiAgZ2V0RmlybXdhcmVJdGVtcyhcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LFxuICAgIHNlbGVjdGVkUHJvZmlsZTogUGFydGlhbDxEZXZpY2VQcm9maWxlPlxuICApOiBDb21wYXJpc29uUmVzdWx0W10ge1xuICAgIGNvbnN0IGRldmljZUZpcm13YXJlID0gZGV2aWNlLmM4eV9GaXJtd2FyZTtcbiAgICBjb25zdCBwcm9maWxlRmlybXdhcmUgPSBnZXQoc2VsZWN0ZWRQcm9maWxlLCAnYzh5X0RldmljZVByb2ZpbGUuZmlybXdhcmUnKTtcbiAgICBjb25zdCBkZXZpY2VJdGVtcyA9IFtdO1xuICAgIGNvbnN0IHByb2ZpbGVJdGVtcyA9IFtdO1xuXG4gICAgaWYgKGRldmljZUZpcm13YXJlKSB7XG4gICAgICBkZXZpY2VJdGVtcy5wdXNoKGRldmljZUZpcm13YXJlKTtcbiAgICB9XG4gICAgaWYgKHByb2ZpbGVGaXJtd2FyZSkge1xuICAgICAgcHJvZmlsZUl0ZW1zLnB1c2gocHJvZmlsZUZpcm13YXJlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUHJvZmlsZUNvbXBhcmlzb24oXG4gICAgICBkZXZpY2VJdGVtcyxcbiAgICAgIHByb2ZpbGVJdGVtcyxcbiAgICAgICduYW1lJyxcbiAgICAgICd2ZXJzaW9uJyxcbiAgICAgIG51bGwsXG4gICAgICB0aGlzLmdldEFsZXJ0KCdmaXJtd2FyZScpXG4gICAgKTtcbiAgfVxuXG4gIGdldFNvZnR3YXJlSXRlbXMoXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBzZWxlY3RlZFByb2ZpbGU6IFBhcnRpYWw8RGV2aWNlUHJvZmlsZT5cbiAgKTogQ29tcGFyaXNvblJlc3VsdFtdIHtcbiAgICBjb25zdCBkZXZpY2VTb2Z0d2FyZSA9IGRldmljZS5jOHlfU29mdHdhcmVMaXN0O1xuICAgIGNvbnN0IHByb2ZpbGVTb2Z0d2FyZSA9IGdldChzZWxlY3RlZFByb2ZpbGUsICdjOHlfRGV2aWNlUHJvZmlsZS5zb2Z0d2FyZScpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVByb2ZpbGVDb21wYXJpc29uKFxuICAgICAgZGV2aWNlU29mdHdhcmUsXG4gICAgICBwcm9maWxlU29mdHdhcmUsXG4gICAgICAnbmFtZScsXG4gICAgICAndmVyc2lvbicsXG4gICAgICAnc29mdHdhcmVUeXBlJyxcbiAgICAgIHRoaXMuZ2V0QWxlcnQoJ3NvZnR3YXJlJylcbiAgICApO1xuICB9XG5cbiAgZ2V0Q29uZmlndXJhdGlvbkl0ZW1zKFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3QsXG4gICAgc2VsZWN0ZWRQcm9maWxlOiBQYXJ0aWFsPERldmljZVByb2ZpbGU+XG4gICk6IENvbXBhcmlzb25SZXN1bHRbXSB7XG4gICAgY29uc3QgZGV2aWNlQ29uZmlndXJhdGlvbiA9IFtdO1xuICAgIE9iamVjdC5rZXlzKGRldmljZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKGtleS5zbGljZSgwLCAxOCkgPT09ICdjOHlfQ29uZmlndXJhdGlvbl8nKSB7XG4gICAgICAgIGRldmljZUNvbmZpZ3VyYXRpb24ucHVzaChkZXZpY2Vba2V5XSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvZmlsZUNvbmZpZ3VyYXRpb24gPSBnZXQoc2VsZWN0ZWRQcm9maWxlLCAnYzh5X0RldmljZVByb2ZpbGUuY29uZmlndXJhdGlvbicpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVByb2ZpbGVDb21wYXJpc29uKFxuICAgICAgZGV2aWNlQ29uZmlndXJhdGlvbixcbiAgICAgIHByb2ZpbGVDb25maWd1cmF0aW9uLFxuICAgICAgJ3VybCcsXG4gICAgICBudWxsLFxuICAgICAgJ3R5cGUnLFxuICAgICAgdGhpcy5nZXRBbGVydCgnY29uZmlndXJhdGlvbicpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlnbnMgZGV2aWNlIHByb2ZpbGUgbWFuYWdlZCBvYmplY3QncyBgc29mdHdhcmVUeXBlISpgIGZyYWdtZW50cyB0byB0aGUgc29mdHdhcmUgaXRlbXNcbiAgICogaW5jbHVkZWQgaW4gdGhlIGRldmljZSBwcm9maWxlLiBSZW1vdmVzIG9ic29sZXRlIHNvZnR3YXJlIHR5cGUgZnJhZ21lbnRzIGFuZCBhZGRzIG5ldy5cbiAgICpcbiAgICogQHBhcmFtIHByb2ZpbGVQYXJ0aWFsIFRoZSBkZXZpY2UgcHJvZmlsZSBtYW5hZ2VkIG9iamVjdCB3aGljaCBgc29mdHdhcmVUeXBlISpgIGZyYWdtZW50cyB3aWxsIGJlIGFkanVzdGVkLlxuICAgKiBAcmV0dXJucyBUaGUgYWRqdXN0ZWQgZGV2aWNlIHByb2ZpbGUgbWFuYWdlZCBvYmplY3QuXG4gICAqL1xuICBhbGlnblNvZnR3YXJlVHlwZUZyYWdtZW50cyhcbiAgICBwcm9maWxlUGFydGlhbDogUGFydGlhbDxEZXZpY2VQcm9maWxlPixcbiAgICBwcm9maWxlOiBEZXZpY2VQcm9maWxlXG4gICk6IFBhcnRpYWw8RGV2aWNlUHJvZmlsZT4ge1xuICAgIGlmICghcHJvZmlsZVBhcnRpYWw/LmM4eV9EZXZpY2VQcm9maWxlPy5zb2Z0d2FyZSB8fCAhcHJvZmlsZSkge1xuICAgICAgcmV0dXJuIHByb2ZpbGVQYXJ0aWFsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbW92ZWRTb2Z0d2FyZVR5cGVzID0gbWFwVmFsdWVzKFxuICAgICAgb21pdEJ5KFxuICAgICAgICBwcm9maWxlLFxuICAgICAgICAoXzogdW5rbm93biwga2V5OiBQcm9wZXJ0eUtleSkgPT5cbiAgICAgICAgICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiAha2V5LnN0YXJ0c1dpdGgoJ3NvZnR3YXJlVHlwZSEnKVxuICAgICAgKSxcbiAgICAgICgpID0+IG51bGxcbiAgICApO1xuICAgIGNvbnN0IHNvZnR3YXJlVHlwZXNUb0FkZDogeyBba2V5OiBQcm9wZXJ0eUtleV06IFJlY29yZDxQcm9wZXJ0eUtleSwgbmV2ZXI+IH0gPSBtYXBWYWx1ZXMoXG4gICAgICBrZXlCeShcbiAgICAgICAgdW5pcUJ5KHByb2ZpbGVQYXJ0aWFsLmM4eV9EZXZpY2VQcm9maWxlLnNvZnR3YXJlLCAnc29mdHdhcmVUeXBlJyksXG4gICAgICAgIChwcm9maWxlOiBEZXZpY2VQcm9maWxlU29mdHdhcmUpID0+IGBzb2Z0d2FyZVR5cGUhJHtwcm9maWxlLnNvZnR3YXJlVHlwZX1gXG4gICAgICApLFxuICAgICAgKCkgPT4gKHt9KVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSB7IC4uLnByb2ZpbGVQYXJ0aWFsLCAuLi5yZW1vdmVkU29mdHdhcmVUeXBlcywgLi4uc29mdHdhcmVUeXBlc1RvQWRkIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldFNvZnR3YXJlVHlwZXMocHJvZmlsZTogRGV2aWNlUHJvZmlsZSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4ga2V5cyhcbiAgICAgIHBpY2tCeShcbiAgICAgICAgcHJvZmlsZSxcbiAgICAgICAgKF86IHVua25vd24sIGtleTogUHJvcGVydHlLZXkpID0+IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIGtleS5zdGFydHNXaXRoKCdzb2Z0d2FyZVR5cGUhJylcbiAgICAgIClcbiAgICApLm1hcChzb2Z0d2FyZVR5cGUgPT4gc29mdHdhcmVUeXBlLnN1YnN0cignc29mdHdhcmVUeXBlIScubGVuZ3RoKSk7XG4gIH1cblxuICBwcml2YXRlIGdldEFsZXJ0KGl0ZW1UeXBlOiBzdHJpbmcpOiAoY29tcGFyaXNpb25SZXN1bHQ6IENvbXBhcmlzb25SZXN1bHQpID0+IHN0cmluZyB7XG4gICAgY29uc3Qgbm90SW5zdGFsbGVkID0gKGNvbXBhcmlzaW9uUmVzdWx0OiBDb21wYXJpc29uUmVzdWx0KSA9PiB7XG4gICAgICByZXR1cm4gIWNvbXBhcmlzaW9uUmVzdWx0LmRldmljZSA/IHRoaXMuTk9UX0lOU1RBTExFRF9XQVJOSU5HIDogJyc7XG4gICAgfTtcblxuICAgIHN3aXRjaCAoaXRlbVR5cGUpIHtcbiAgICAgIGNhc2UgJ2Zpcm13YXJlJzpcbiAgICAgIGNhc2UgJ3NvZnR3YXJlJzpcbiAgICAgICAgcmV0dXJuIChjb21wYXJpc2lvblJlc3VsdDogQ29tcGFyaXNvblJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21wYXJpc2lvblJlc3VsdC5kZXZpY2UgJiZcbiAgICAgICAgICAgIGNvbXBhcmlzaW9uUmVzdWx0LnByb2ZpbGUgJiZcbiAgICAgICAgICAgIGNvbXBhcmlzaW9uUmVzdWx0LmRldmljZS5pdGVtRGV0YWlscyAhPT0gY29tcGFyaXNpb25SZXN1bHQucHJvZmlsZS5pdGVtRGV0YWlsc1xuICAgICAgICAgICAgPyB0aGlzLlZFUlNJT05fTUlTU01BVENIX1dBUk5JTkdcbiAgICAgICAgICAgIDogbm90SW5zdGFsbGVkKGNvbXBhcmlzaW9uUmVzdWx0KTtcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ2NvbmZpZ3VyYXRpb24nOlxuICAgICAgICByZXR1cm4gKGNvbXBhcmlzaW9uUmVzdWx0OiBDb21wYXJpc29uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmlzaW9uUmVzdWx0LmRldmljZSAmJlxuICAgICAgICAgICAgY29tcGFyaXNpb25SZXN1bHQucHJvZmlsZSAmJlxuICAgICAgICAgICAgKGNvbXBhcmlzaW9uUmVzdWx0LmRldmljZS5pdGVtTmFtZSAhPT0gY29tcGFyaXNpb25SZXN1bHQucHJvZmlsZS5pdGVtTmFtZSB8fFxuICAgICAgICAgICAgICBjb21wYXJpc2lvblJlc3VsdC5kZXZpY2UuaXRlbURldGFpbHMgIT09IGNvbXBhcmlzaW9uUmVzdWx0LnByb2ZpbGUuaXRlbURldGFpbHMpXG4gICAgICAgICAgICA/IHRoaXMuU0FNRV9VUkxfV0FSTklOR1xuICAgICAgICAgICAgOiBub3RJbnN0YWxsZWQoY29tcGFyaXNpb25SZXN1bHQpO1xuICAgICAgICB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5vdEluc3RhbGxlZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVByb2ZpbGVDb21wYXJpc29uKFxuICAgIGRldmljZUl0ZW1zOiBhbnlbXSA9IFtdLFxuICAgIHByb2ZpbGVJdGVtczogQXJyYXk8RGV2aWNlUHJvZmlsZVNvZnR3YXJlIHwgRGV2aWNlUHJvZmlsZUZpcm13YXJlPiA9IFtdLFxuICAgIG1lcmdlQnlQcm9wZXJ0eTogc3RyaW5nLFxuICAgIHByb3BlcnR5TmFtZVdpdGhEZXRhaWxzOiBzdHJpbmcsXG4gICAgcHJvcGVydHlOYW1lV2l0aFR5cGU6IHN0cmluZyxcbiAgICBnZXRBbGVydDogKGNvbXBhcmlzaW9uUmVzdWx0OiBDb21wYXJpc29uUmVzdWx0KSA9PiBzdHJpbmdcbiAgKTogQ29tcGFyaXNvblJlc3VsdFtdIHtcbiAgICBjb25zdCBjb21wYXJpc29uT2JqID0gdGhpcy5jcmVhdGVQcm9maWxlQ29tcGFyaXNvbkZyb21EZXZpY2VJdGVtcyhcbiAgICAgIGRldmljZUl0ZW1zLFxuICAgICAgbWVyZ2VCeVByb3BlcnR5LFxuICAgICAgcHJvcGVydHlOYW1lV2l0aERldGFpbHMsXG4gICAgICBwcm9wZXJ0eU5hbWVXaXRoVHlwZVxuICAgICk7XG4gICAgY29uc3QgZXh0ZW5kZWRDb21wYXJpc29uT2JqID0gdGhpcy5leHRlbmRQcm9maWxlQ29tcGFyaXNvbldpdGhQcm9maWxlSXRlbXMoXG4gICAgICBjb21wYXJpc29uT2JqLFxuICAgICAgcHJvZmlsZUl0ZW1zLFxuICAgICAgbWVyZ2VCeVByb3BlcnR5LFxuICAgICAgcHJvcGVydHlOYW1lV2l0aERldGFpbHMsXG4gICAgICBwcm9wZXJ0eU5hbWVXaXRoVHlwZSxcbiAgICAgIGdldEFsZXJ0XG4gICAgKTtcbiAgICByZXR1cm4gc29ydEJ5KHRvQXJyYXkoZXh0ZW5kZWRDb21wYXJpc29uT2JqKSwgJ25hbWUnKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUHJvZmlsZUNvbXBhcmlzb25Gcm9tRGV2aWNlSXRlbXMoXG4gICAgZGV2aWNlSXRlbXM6IGFueVtdLFxuICAgIG1lcmdlQnlQcm9wZXJ0eTogc3RyaW5nLFxuICAgIHByb3BlcnR5TmFtZVdpdGhEZXRhaWxzOiBzdHJpbmcsXG4gICAgcHJvcGVydHlOYW1lV2l0aFR5cGU6IHN0cmluZ1xuICApOiBhbnkge1xuICAgIHJldHVybiBkZXZpY2VJdGVtcy5yZWR1Y2UoXG4gICAgICAoY29tYXByaXRpb25JdGVtLCBkZXZpY2VJdGVtKSA9PlxuICAgICAgICBPYmplY3QuYXNzaWduKGNvbWFwcml0aW9uSXRlbSwge1xuICAgICAgICAgIFtkZXZpY2VJdGVtW21lcmdlQnlQcm9wZXJ0eV1dOiB7XG4gICAgICAgICAgICBkZXZpY2U6IG9taXRCeShcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiBkZXZpY2VJdGVtLm5hbWUsXG4gICAgICAgICAgICAgICAgaXRlbURldGFpbHM6IGRldmljZUl0ZW1bcHJvcGVydHlOYW1lV2l0aERldGFpbHNdLFxuICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiBkZXZpY2VJdGVtW3Byb3BlcnR5TmFtZVdpdGhUeXBlXSxcbiAgICAgICAgICAgICAgICBpdGVtVXJsOiBkZXZpY2VJdGVtLnVybFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBpc05pbFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHByb2ZpbGU6IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4dGVuZFByb2ZpbGVDb21wYXJpc29uV2l0aFByb2ZpbGVJdGVtcyhcbiAgICBjb21wYXJpc29uT2JqOiBvYmplY3QsXG4gICAgcHJvZmlsZUl0ZW1zOiBBcnJheTxEZXZpY2VQcm9maWxlU29mdHdhcmUgfCBEZXZpY2VQcm9maWxlRmlybXdhcmU+LFxuICAgIG1lcmdlQnlQcm9wZXJ0eTogc3RyaW5nLFxuICAgIHByb3BlcnR5TmFtZVdpdGhEZXRhaWxzOiBzdHJpbmcsXG4gICAgcHJvcGVydHlOYW1lV2l0aFR5cGU6IHN0cmluZyxcbiAgICBnZXRBbGVydDogKGNvbXBhcmlzaW9uUmVzdWx0OiBDb21wYXJpc29uUmVzdWx0KSA9PiBzdHJpbmdcbiAgKSB7XG4gICAgcHJvZmlsZUl0ZW1zLmZvckVhY2gocHJvZmlsZUl0ZW0gPT4ge1xuICAgICAgY29uc3QgY29tcGFyaXNpb25SZXN1bHQ6IENvbXBhcmlzb25SZXN1bHQgPSB7XG4gICAgICAgIHByb2ZpbGU6IG9taXRCeShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpdGVtTmFtZTogcHJvZmlsZUl0ZW0ubmFtZSxcbiAgICAgICAgICAgIGl0ZW1EZXRhaWxzOiBwcm9maWxlSXRlbVtwcm9wZXJ0eU5hbWVXaXRoRGV0YWlsc10sXG4gICAgICAgICAgICBpdGVtVHlwZTogcHJvZmlsZUl0ZW1bcHJvcGVydHlOYW1lV2l0aFR5cGVdLFxuICAgICAgICAgICAgaXRlbVVybDogcHJvZmlsZUl0ZW0udXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpc05pbFxuICAgICAgICApLFxuICAgICAgICBkZXZpY2U6IGNvbXBhcmlzb25PYmpbcHJvZmlsZUl0ZW1bbWVyZ2VCeVByb3BlcnR5XV1cbiAgICAgICAgICA/IGNvbXBhcmlzb25PYmpbcHJvZmlsZUl0ZW1bbWVyZ2VCeVByb3BlcnR5XV0uZGV2aWNlXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgICBjb21wYXJpc2lvblJlc3VsdC5jb21wYXJpc29uQWxlcnQgPSBnZXRBbGVydChjb21wYXJpc2lvblJlc3VsdCk7XG4gICAgICBjb21wYXJpc29uT2JqW3Byb2ZpbGVJdGVtW21lcmdlQnlQcm9wZXJ0eV1dID0gY29tcGFyaXNpb25SZXN1bHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbXBhcmlzb25PYmo7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { Component, forwardRef } from '@angular/core';
|
|
1
|
+
import { Component, DestroyRef, forwardRef, inject } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
2
3
|
import { ActivatedRoute } from '@angular/router';
|
|
3
4
|
import { AlertService, gettext, ManagedObjectRealtimeService, OperationRealtimeService, PRODUCT_EXPERIENCE_EVENT_SOURCE } from '@c8y/ngx-components';
|
|
4
5
|
import { has, pickBy } from 'lodash-es';
|
|
5
|
-
import { pipe } from 'rxjs';
|
|
6
|
-
import { filter, map } from 'rxjs/operators';
|
|
6
|
+
import { BehaviorSubject, combineLatest, pipe } from 'rxjs';
|
|
7
|
+
import { filter, map, switchMap, tap } from 'rxjs/operators';
|
|
7
8
|
import { PRODUCT_EXPERIENCE_DEVICE_PROFILE } from '../device-profile.model';
|
|
8
9
|
import { DeviceProfileService } from '../device-profile.service';
|
|
9
10
|
import * as i0 from "@angular/core";
|
|
@@ -25,31 +26,43 @@ export class DeviceTabProfileComponent {
|
|
|
25
26
|
this.firmwareItems = [];
|
|
26
27
|
this.softwareItems = [];
|
|
27
28
|
this.configurationItems = [];
|
|
28
|
-
this.pattern = '';
|
|
29
|
-
this.
|
|
29
|
+
this.pattern$ = new BehaviorSubject('');
|
|
30
|
+
this.reload$ = new BehaviorSubject(true);
|
|
30
31
|
this.productExperienceEvent = {
|
|
31
32
|
eventName: PRODUCT_EXPERIENCE_DEVICE_PROFILE.EVENTS.DEVICE_TAB,
|
|
32
33
|
data: {
|
|
33
34
|
component: PRODUCT_EXPERIENCE_DEVICE_PROFILE.COMPONENTS.DEVICE_TAB_PROFILE
|
|
34
35
|
}
|
|
35
36
|
};
|
|
37
|
+
this.destroyRef = inject(DestroyRef);
|
|
38
|
+
this.device = this.route.snapshot.parent.data.contextData;
|
|
36
39
|
}
|
|
37
40
|
async ngOnInit() {
|
|
38
|
-
this.device = this.route.snapshot.parent.data.contextData;
|
|
39
41
|
this.getDeviceProfilesAndUpdateProfileItems();
|
|
40
42
|
this.subscribeToManagedObjects();
|
|
43
|
+
const supportedSoftwareTypes = new Set(this.device.c8y_SupportedSoftwareTypes);
|
|
44
|
+
const isSubset = (profileTypes) => {
|
|
45
|
+
return profileTypes.every(type => supportedSoftwareTypes.has(type));
|
|
46
|
+
};
|
|
47
|
+
this.filterPipe = pipe(map(data => {
|
|
48
|
+
if (supportedSoftwareTypes.size) {
|
|
49
|
+
return data.filter(mo => isSubset(this.deviceProfileService.getSoftwareTypes(mo)));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
return data;
|
|
53
|
+
}
|
|
54
|
+
}));
|
|
41
55
|
}
|
|
42
56
|
async getDeviceProfilesAndUpdateProfileItems() {
|
|
43
|
-
this.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
this.
|
|
52
|
-
this.reloading = false;
|
|
57
|
+
this.deviceProfiles$ = combineLatest([this.reload$.pipe(filter(Boolean)), this.pattern$]).pipe(switchMap(([_, name]) => this.deviceProfileService.getDeviceProfilesByDevice(this.device, name)), tap(async (profiles) => {
|
|
58
|
+
if (this.device.c8y_Profile) {
|
|
59
|
+
const profileId = this.device.c8y_Profile.profileId;
|
|
60
|
+
this.selectedProfile = profiles.data.find(mo => mo.id === profileId);
|
|
61
|
+
}
|
|
62
|
+
this.updateProfileItems(this.device, this.selectedProfile);
|
|
63
|
+
this.operation = await this.deviceProfileService.getProfileOperation(this.device.id);
|
|
64
|
+
this.subscribeToOperations();
|
|
65
|
+
}), tap(() => this.reload$.next(false)), takeUntilDestroyed(this.destroyRef));
|
|
53
66
|
}
|
|
54
67
|
selectProfile(mo) {
|
|
55
68
|
this.selectedProfile = this.toProfileForDevice(mo);
|
|
@@ -58,37 +71,30 @@ export class DeviceTabProfileComponent {
|
|
|
58
71
|
async createOperation() {
|
|
59
72
|
this.operation = await this.deviceProfileService.createProfileOperation(this.device, this.selectedProfile);
|
|
60
73
|
}
|
|
61
|
-
setPipe(filterStr) {
|
|
62
|
-
this.pattern = filterStr;
|
|
63
|
-
this.filterPipe = pipe(map(data => {
|
|
64
|
-
return data.filter(mo => mo.name && mo.name.toLowerCase().indexOf(filterStr.toLowerCase()) > -1);
|
|
65
|
-
}));
|
|
66
|
-
}
|
|
67
|
-
ngOnDestroy() {
|
|
68
|
-
this.operationsSubscription.unsubscribe();
|
|
69
|
-
this.moOnUpdateSubscription.unsubscribe();
|
|
70
|
-
this.moOnDeleteSubscription.unsubscribe();
|
|
71
|
-
}
|
|
72
74
|
updateProfileItems(device, profile) {
|
|
73
75
|
this.firmwareItems = this.deviceProfileService.getFirmwareItems(device, profile);
|
|
74
76
|
this.softwareItems = this.deviceProfileService.getSoftwareItems(device, profile);
|
|
75
77
|
this.configurationItems = this.deviceProfileService.getConfigurationItems(device, profile);
|
|
76
78
|
}
|
|
77
79
|
subscribeToManagedObjects() {
|
|
78
|
-
this.
|
|
80
|
+
this.deviceRealtime
|
|
79
81
|
.onUpdate$(this.device.id)
|
|
82
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
80
83
|
.subscribe((managedObject) => {
|
|
81
84
|
this.updateProfileItems(managedObject, this.selectedProfile);
|
|
82
85
|
});
|
|
83
|
-
this.
|
|
86
|
+
this.deviceRealtime
|
|
87
|
+
.onDelete$(this.device.id)
|
|
88
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
89
|
+
.subscribe(() => {
|
|
84
90
|
this.alertService.danger(gettext('This device has just been deleted. You will be redirected to "All devices" page now.'));
|
|
85
91
|
window.location.href = '#/device';
|
|
86
92
|
});
|
|
87
93
|
}
|
|
88
94
|
subscribeToOperations() {
|
|
89
|
-
this.
|
|
95
|
+
this.operationRealtime
|
|
90
96
|
.onAll$(this.device.id)
|
|
91
|
-
.pipe(map(({ data }) => data), filter(operation => operation.c8y_DeviceProfile))
|
|
97
|
+
.pipe(map(({ data }) => data), filter(operation => operation.c8y_DeviceProfile), takeUntilDestroyed(this.destroyRef))
|
|
92
98
|
.subscribe(operation => {
|
|
93
99
|
this.operation = operation;
|
|
94
100
|
});
|
|
@@ -115,7 +121,7 @@ export class DeviceTabProfileComponent {
|
|
|
115
121
|
provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
|
|
116
122
|
useExisting: forwardRef(() => DeviceTabProfileComponent)
|
|
117
123
|
}
|
|
118
|
-
], ngImport: i0, template: "<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"
|
|
124
|
+
], ngImport: i0, template: "<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"reload$.next(true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reload$.value }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"deviceRealtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid--fullpage card--grid--fullpage card--grid grid__row--2-10--md\">\n <div class=\"card--grid grid__col--6-6--md\">\n <!-- AVAILABLE PROFILES -->\n <div class=\"bg-level-0\">\n <div class=\"card-header separator\">\n <div\n class=\"card-title\"\n translate\n >\n Device profile\n </div>\n </div>\n <div class=\"p-16\">\n <form #deviceProfileForm=\"ngForm\">\n <div class=\"input-group\">\n <c8y-typeahead\n class=\"flex-grow\"\n placeholder=\"{{ 'Select device profile' | translate }}\"\n name=\"selectProfile\"\n data-cy=\"device-tab-profile--select-device-profile\"\n [(ngModel)]=\"selectedProfile\"\n (onSearch)=\"pattern$.next($event)\"\n [allowFreeEntries]=\"false\"\n >\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n *c8yFor=\"let profile of deviceProfiles$; pipe: filterPipe\"\n (click)=\"selectProfile(profile); pattern$.next('')\"\n >\n <c8y-highlight\n [text]=\"profile.name || '--'\"\n [pattern]=\"pattern$.value\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Assign device profile' | translate }}\"\n type=\"button\"\n (click)=\"createOperation()\"\n data-cy=\"device-tab-profile--Assign-device-profile-button\"\n [disabled]=\"!selectedProfile?.id\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.ACTIONS.ASSIGN_DEVICE_PROFILE }\"\n >\n <span>{{ 'Assign device profile' | translate }}</span>\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n\n <!-- INSTALL PROFILE OPERATION -->\n <div class=\"bg-level-1\">\n <div class=\"card-header separator\">\n <div\n class=\"card-title\"\n translate\n >\n Currently installed\n </div>\n </div>\n <div class=\"card-block\">\n <c8y-operation-details\n [operation]=\"operation\"\n c8yProductExperience\n inherit\n suppressDataOverriding\n ></c8y-operation-details>\n </div>\n </div>\n </div>\n <div class=\"card--grid__inner-scroll d-col no-align-items\">\n <div class=\"d-contents\">\n <!-- FIRMWARE -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'c8y-firmware'\"\n [sectionTitle]=\"'Firmware' | translate\"\n [emptyStateText]=\"'No firmware to display.' | translate\"\n [emptyStateDetails]=\"'No firmware assigned.' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"firmwareItems\"\n [isEmpty]=\"!selectedProfile?.c8y_DeviceProfile?.firmware?.name\"\n ></c8y-device-tab-profile-detail>\n </div>\n <div class=\"d-contents\">\n <!-- SOFTWARE -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'c8y-tools'\"\n [sectionTitle]=\"'Software' | translate\"\n [emptyStateText]=\"'No software to display.' | translate\"\n [emptyStateDetails]=\"'No software assigned.' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"softwareItems\"\n [isEmpty]=\"\n !selectedProfile?.c8y_DeviceProfile?.software ||\n selectedProfile?.c8y_DeviceProfile?.software?.length === 0\n \"\n ></c8y-device-tab-profile-detail>\n </div>\n <div class=\"d-contents\">\n <!-- CONFIGURATION -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'gears'\"\n [sectionTitle]=\"'Configuration' | translate\"\n [emptyStateText]=\"'No configuration to display' | translate\"\n [emptyStateDetails]=\"'No configuration assigned' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"configurationItems\"\n [isEmpty]=\"\n !selectedProfile?.c8y_DeviceProfile?.configuration ||\n selectedProfile?.c8y_DeviceProfile?.configuration?.length === 0\n \"\n ></c8y-device-tab-profile-detail>\n </div>\n <!-- fill in the remanining vertical space when empty -->\n <div class=\"card--grid grid__col--6-6--md flex-grow\">\n <div class=\"bg-level-0\"></div>\n <div class=\"bg-level-1\"></div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i1.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: i1.TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected", "highlightFirstItem"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "directive", type: i1.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "component", type: i1.RealtimeButtonComponent, selector: "c8y-realtime-btn", inputs: ["service", "label", "title", "disabled"], outputs: ["onToggle"] }, { kind: "component", type: i6.OperationDetailsComponent, selector: "c8y-operation-details", inputs: ["operation"] }, { kind: "component", type: i7.DeviceTabProfileDetailComponent, selector: "c8y-device-tab-profile-detail", inputs: ["sectionTitle", "sectionIcon", "emptyStateText", "emptyStateDetails", "isProfileSelected", "isEmpty", "items", "showTextLabel"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] }); }
|
|
119
125
|
}
|
|
120
126
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DeviceTabProfileComponent, decorators: [{
|
|
121
127
|
type: Component,
|
|
@@ -125,6 +131,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
125
131
|
provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
|
|
126
132
|
useExisting: forwardRef(() => DeviceTabProfileComponent)
|
|
127
133
|
}
|
|
128
|
-
], template: "<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"
|
|
134
|
+
], template: "<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"reload$.next(true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reload$.value }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"deviceRealtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid--fullpage card--grid--fullpage card--grid grid__row--2-10--md\">\n <div class=\"card--grid grid__col--6-6--md\">\n <!-- AVAILABLE PROFILES -->\n <div class=\"bg-level-0\">\n <div class=\"card-header separator\">\n <div\n class=\"card-title\"\n translate\n >\n Device profile\n </div>\n </div>\n <div class=\"p-16\">\n <form #deviceProfileForm=\"ngForm\">\n <div class=\"input-group\">\n <c8y-typeahead\n class=\"flex-grow\"\n placeholder=\"{{ 'Select device profile' | translate }}\"\n name=\"selectProfile\"\n data-cy=\"device-tab-profile--select-device-profile\"\n [(ngModel)]=\"selectedProfile\"\n (onSearch)=\"pattern$.next($event)\"\n [allowFreeEntries]=\"false\"\n >\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n *c8yFor=\"let profile of deviceProfiles$; pipe: filterPipe\"\n (click)=\"selectProfile(profile); pattern$.next('')\"\n >\n <c8y-highlight\n [text]=\"profile.name || '--'\"\n [pattern]=\"pattern$.value\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Assign device profile' | translate }}\"\n type=\"button\"\n (click)=\"createOperation()\"\n data-cy=\"device-tab-profile--Assign-device-profile-button\"\n [disabled]=\"!selectedProfile?.id\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.ACTIONS.ASSIGN_DEVICE_PROFILE }\"\n >\n <span>{{ 'Assign device profile' | translate }}</span>\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n\n <!-- INSTALL PROFILE OPERATION -->\n <div class=\"bg-level-1\">\n <div class=\"card-header separator\">\n <div\n class=\"card-title\"\n translate\n >\n Currently installed\n </div>\n </div>\n <div class=\"card-block\">\n <c8y-operation-details\n [operation]=\"operation\"\n c8yProductExperience\n inherit\n suppressDataOverriding\n ></c8y-operation-details>\n </div>\n </div>\n </div>\n <div class=\"card--grid__inner-scroll d-col no-align-items\">\n <div class=\"d-contents\">\n <!-- FIRMWARE -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'c8y-firmware'\"\n [sectionTitle]=\"'Firmware' | translate\"\n [emptyStateText]=\"'No firmware to display.' | translate\"\n [emptyStateDetails]=\"'No firmware assigned.' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"firmwareItems\"\n [isEmpty]=\"!selectedProfile?.c8y_DeviceProfile?.firmware?.name\"\n ></c8y-device-tab-profile-detail>\n </div>\n <div class=\"d-contents\">\n <!-- SOFTWARE -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'c8y-tools'\"\n [sectionTitle]=\"'Software' | translate\"\n [emptyStateText]=\"'No software to display.' | translate\"\n [emptyStateDetails]=\"'No software assigned.' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"softwareItems\"\n [isEmpty]=\"\n !selectedProfile?.c8y_DeviceProfile?.software ||\n selectedProfile?.c8y_DeviceProfile?.software?.length === 0\n \"\n ></c8y-device-tab-profile-detail>\n </div>\n <div class=\"d-contents\">\n <!-- CONFIGURATION -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'gears'\"\n [sectionTitle]=\"'Configuration' | translate\"\n [emptyStateText]=\"'No configuration to display' | translate\"\n [emptyStateDetails]=\"'No configuration assigned' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"configurationItems\"\n [isEmpty]=\"\n !selectedProfile?.c8y_DeviceProfile?.configuration ||\n selectedProfile?.c8y_DeviceProfile?.configuration?.length === 0\n \"\n ></c8y-device-tab-profile-detail>\n </div>\n <!-- fill in the remanining vertical space when empty -->\n <div class=\"card--grid grid__col--6-6--md flex-grow\">\n <div class=\"bg-level-0\"></div>\n <div class=\"bg-level-1\"></div>\n </div>\n </div>\n</div>\n" }]
|
|
129
135
|
}], ctorParameters: () => [{ type: i1.ManagedObjectRealtimeService }, { type: i2.DeviceProfileService }, { type: i3.ActivatedRoute }, { type: i1.OperationRealtimeService }, { type: i1.AlertService }] });
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLXRhYi1wcm9maWxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2RldmljZS1wcm9maWxlL2RldmljZS10YWItcHJvZmlsZS9kZXZpY2UtdGFiLXByb2ZpbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vZGV2aWNlLXByb2ZpbGUvZGV2aWNlLXRhYi1wcm9maWxlL2RldmljZS10YWItcHJvZmlsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFDTCxZQUFZLEVBRVosT0FBTyxFQUNQLDRCQUE0QixFQUM1Qix3QkFBd0IsRUFDeEIsK0JBQStCLEVBR2hDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDeEMsT0FBTyxFQUFFLElBQUksRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBR0wsaUNBQWlDLEVBQ2xDLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7OztBQWFqRSxNQUFNLE9BQU8seUJBQXlCO0lBdUJwQyxZQUNTLGNBQTRDLEVBQzNDLG9CQUEwQyxFQUMxQyxLQUFxQixFQUNyQixpQkFBMkMsRUFDM0MsWUFBMEI7UUFKM0IsbUJBQWMsR0FBZCxjQUFjLENBQThCO1FBQzNDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsc0JBQWlCLEdBQWpCLGlCQUFp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WUFDVCw0QkFBNEI7WUFDNUI7Z0JBQ0UsT0FBTyxFQUFFLCtCQUErQjtnQkFDeEMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQzthQUN6RDtTQUNGLDBCQ2hDSCxvdUtBa0pBOzsyRkRoSGEseUJBQXlCO2tCQVhyQyxTQUFTOytCQUNFLHdCQUF3QixhQUV2Qjt3QkFDVCw0QkFBNEI7d0JBQzVCOzRCQUNFLE9BQU8sRUFBRSwrQkFBK0I7NEJBQ3hDLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDBCQUEwQixDQUFDO3lCQUN6RDtxQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElNYW5hZ2VkT2JqZWN0LCBJT3BlcmF0aW9uLCBJUmVzdWx0TGlzdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIEFsZXJ0U2VydmljZSxcbiAgRm9yT2ZGaWx0ZXJQaXBlLFxuICBnZXR0ZXh0LFxuICBNYW5hZ2VkT2JqZWN0UmVhbHRpbWVTZXJ2aWNlLFxuICBPcGVyYXRpb25SZWFsdGltZVNlcnZpY2UsXG4gIFBST0RVQ1RfRVhQRVJJRU5DRV9FVkVOVF9TT1VSQ0UsXG4gIFByb2R1Y3RFeHBlcmllbmNlRXZlbnQsXG4gIFByb2R1Y3RFeHBlcmllbmNlRXZlbnRTb3VyY2Vcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBoYXMsIHBpY2tCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBwaXBlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQ29tcGFyaXNvblJlc3VsdCxcbiAgRGV2aWNlUHJvZmlsZSxcbiAgUFJPRFVDVF9FWFBFUklFTkNFX0RFVklDRV9QUk9GSUxFXG59IGZyb20gJy4uL2RldmljZS1wcm9maWxlLm1vZGVsJztcbmltcG9ydCB7IERldmljZVByb2ZpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vZGV2aWNlLXByb2ZpbGUuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kZXZpY2UtdGFiLXByb2ZpbGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGV2aWNlLXRhYi1wcm9maWxlLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgTWFuYWdlZE9iamVjdFJlYWx0aW1lU2VydmljZSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBQUk9EVUNUX0VYUEVSSUVOQ0VfRVZFTlRfU09VUkNFLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGV2aWNlVGFiUHJvZmlsZUNvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGV2aWNlVGFiUHJvZmlsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50U291cmNlIHtcbiAgUFJPRFVDVF9FWFBFUklFTkNFID0gUFJPRFVDVF9FWFBFUklFTkNFX0RFVklDRV9QUk9GSUxFO1xuICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0O1xuICBkZXZpY2VQcm9maWxlczogSVJlc3VsdExpc3Q8SU1hbmFnZWRPYmplY3Q+O1xuICBzZWxlY3RlZFByb2ZpbGU6IFBhcnRpYWw8RGV2aWNlUHJvZmlsZT47XG4gIG9wZXJhdGlvbjogSU9wZXJhdGlvbjtcbiAgZmlybXdhcmVJdGVtczogQ29tcGFyaXNvblJlc3VsdFtdID0gW107XG4gIHNvZnR3YXJlSXRlbXM6IENvbXBhcmlzb25SZXN1bHRbXSA9IFtdO1xuICBjb25maWd1cmF0aW9uSXRlbXM6IENvbXBhcmlzb25SZXN1bHRbXSA9IFtdO1xuXG4gIGZpbHRlclBpcGU6IEZvck9mRmlsdGVyUGlwZTtcbiAgcGF0dGVybiA9ICcnO1xuICByZWxvYWRpbmcgPSBmYWxzZTtcbiAgcHJvZHVjdEV4cGVyaWVuY2VFdmVudDogUHJvZHVjdEV4cGVyaWVuY2VFdmVudCA9IHtcbiAgICBldmVudE5hbWU6IFBST0RVQ1RfRVhQRVJJRU5DRV9ERVZJQ0VfUFJPRklMRS5FVkVOVFMuREVWSUNFX1RBQixcbiAgICBkYXRhOiB7XG4gICAgICBjb21wb25lbnQ6IFBST0RVQ1RfRVhQRVJJRU5DRV9ERVZJQ0VfUFJPRklMRS5DT01QT05FTlRTLkRFVklDRV9UQUJfUFJPRklMRVxuICAgIH1cbiAgfTtcbiAgcHJpdmF0ZSBvcGVyYXRpb25zU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgbW9PbkRlbGV0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIG1vT25VcGRhdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGV2aWNlUmVhbHRpbWU6IE1hbmFnZWRPYmplY3RSZWFsdGltZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkZXZpY2VQcm9maWxlU2VydmljZTogRGV2aWNlUHJvZmlsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBvcGVyYXRpb25SZWFsdGltZTogT3BlcmF0aW9uUmVhbHRpbWVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZGV2aWNlID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJlbnQuZGF0YS5jb250ZXh0RGF0YTtcbiAgICB0aGlzLmdldERldmljZVByb2ZpbGVzQW5kVXBkYXRlUHJvZmlsZUl0ZW1zKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb01hbmFnZWRPYmplY3RzKCk7XG4gIH1cblxuICBhc3luYyBnZXREZXZpY2VQcm9maWxlc0FuZFVwZGF0ZVByb2ZpbGVJdGVtcygpIHtcbiAgICB0aGlzLnJlbG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5kZXZpY2VQcm9maWxlcyA9IGF3YWl0IHRoaXMuZGV2aWNlUHJvZmlsZVNlcnZpY2UuZ2V0RGV2aWNlUHJvZmlsZXNCeURldmljZVR5cGUoXG4gICAgICB0aGlzLmRldmljZS50eXBlXG4gICAgKTtcbiAgICBpZiAodGhpcy5kZXZpY2UuYzh5X1Byb2ZpbGUpIHtcbiAgICAgIGNvbnN0IHByb2ZpbGVJZCA9IHRoaXMuZGV2aWNlLmM4eV9Qcm9maWxlLnByb2ZpbGVJZDtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcm9maWxlID0gdGhpcy5kZXZpY2VQcm9maWxlcy5kYXRhLmZpbmQobW8gPT4gbW8uaWQgPT09IHByb2ZpbGVJZCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlUHJvZmlsZUl0ZW1zKHRoaXMuZGV2aWNlLCB0aGlzLnNlbGVjdGVkUHJvZmlsZSk7XG4gICAgdGhpcy5vcGVyYXRpb24gPSBhd2FpdCB0aGlzLmRldmljZVByb2ZpbGVTZXJ2aWNlLmdldFByb2ZpbGVPcGVyYXRpb24odGhpcy5kZXZpY2UuaWQpO1xuICAgIHRoaXMuc3Vic2NyaWJlVG9PcGVyYXRpb25zKCk7XG4gICAgdGhpcy5yZWxvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHNlbGVjdFByb2ZpbGUobW86IERldmljZVByb2ZpbGUpIHtcbiAgICB0aGlzLnNlbGVjdGVkUHJvZmlsZSA9IHRoaXMudG9Qcm9maWxlRm9yRGV2aWNlKG1vKTtcbiAgICB0aGlzLnVwZGF0ZVByb2ZpbGVJdGVtcyh0aGlzLmRldmljZSwgdGhpcy5zZWxlY3RlZFByb2ZpbGUpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT3BlcmF0aW9uKCkge1xuICAgIHRoaXMub3BlcmF0aW9uID0gYXdhaXQgdGhpcy5kZXZpY2VQcm9maWxlU2VydmljZS5jcmVhdGVQcm9maWxlT3BlcmF0aW9uKFxuICAgICAgdGhpcy5kZXZpY2UsXG4gICAgICB0aGlzLnNlbGVjdGVkUHJvZmlsZVxuICAgICk7XG4gIH1cblxuICBzZXRQaXBlKGZpbHRlclN0cjogc3RyaW5nKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gZmlsdGVyU3RyO1xuICAgIHRoaXMuZmlsdGVyUGlwZSA9IHBpcGUoXG4gICAgICBtYXAoZGF0YSA9PiB7XG4gICAgICAgIHJldHVybiBkYXRhLmZpbHRlcihcbiAgICAgICAgICBtbyA9PiBtby5uYW1lICYmIG1vLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGZpbHRlclN0ci50b0xvd2VyQ2FzZSgpKSA+IC0xXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLm9wZXJhdGlvbnNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm1vT25VcGRhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm1vT25EZWxldGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHVwZGF0ZVByb2ZpbGVJdGVtcyhkZXZpY2UsIHByb2ZpbGUpIHtcbiAgICB0aGlzLmZpcm13YXJlSXRlbXMgPSB0aGlzLmRldmljZVByb2ZpbGVTZXJ2aWNlLmdldEZpcm13YXJlSXRlbXMoZGV2aWNlLCBwcm9maWxlKTtcbiAgICB0aGlzLnNvZnR3YXJlSXRlbXMgPSB0aGlzLmRldmljZVByb2ZpbGVTZXJ2aWNlLmdldFNvZnR3YXJlSXRlbXMoZGV2aWNlLCBwcm9maWxlKTtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb25JdGVtcyA9IHRoaXMuZGV2aWNlUHJvZmlsZVNlcnZpY2UuZ2V0Q29uZmlndXJhdGlvbkl0ZW1zKGRldmljZSwgcHJvZmlsZSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvTWFuYWdlZE9iamVjdHMoKSB7XG4gICAgdGhpcy5tb09uVXBkYXRlU3Vic2NyaXB0aW9uID0gdGhpcy5kZXZpY2VSZWFsdGltZVxuICAgICAgLm9uVXBkYXRlJCh0aGlzLmRldmljZS5pZClcbiAgICAgIC5zdWJzY3JpYmUoKG1hbmFnZWRPYmplY3Q6IElNYW5hZ2VkT2JqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlUHJvZmlsZUl0ZW1zKG1hbmFnZWRPYmplY3QsIHRoaXMuc2VsZWN0ZWRQcm9maWxlKTtcbiAgICAgIH0pO1xuICAgIHRoaXMubW9PbkRlbGV0ZVN1YnNjcmlwdGlvbiA9IHRoaXMuZGV2aWNlUmVhbHRpbWUub25EZWxldGUkKHRoaXMuZGV2aWNlLmlkKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZGFuZ2VyKFxuICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgICdUaGlzIGRldmljZSBoYXMganVzdCBiZWVuIGRlbGV0ZWQuIFlvdSB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gXCJBbGwgZGV2aWNlc1wiIHBhZ2Ugbm93LidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJyMvZGV2aWNlJztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9PcGVyYXRpb25zKCkge1xuICAgIHRoaXMub3BlcmF0aW9uc1N1YnNjcmlwdGlvbiA9IHRoaXMub3BlcmF0aW9uUmVhbHRpbWVcbiAgICAgIC5vbkFsbCQodGhpcy5kZXZpY2UuaWQpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSBhcyBJT3BlcmF0aW9uKSxcbiAgICAgICAgZmlsdGVyKG9wZXJhdGlvbiA9PiBvcGVyYXRpb24uYzh5X0RldmljZVByb2ZpbGUpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKG9wZXJhdGlvbiA9PiB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRvUHJvZmlsZUZvckRldmljZShwcm9maWxlOiBEZXZpY2VQcm9maWxlKTogRGV2aWNlUHJvZmlsZSB7XG4gICAgaWYgKFxuICAgICAgQXJyYXkuZnJvbShwcm9maWxlPy5jOHlfRGV2aWNlUHJvZmlsZT8uc29mdHdhcmUgfHwgW10pLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgaGFzKHRoaXMuZGV2aWNlLCAnYzh5X1N1cHBvcnRlZFNvZnR3YXJlVHlwZXMnKVxuICAgICkge1xuICAgICAgcmV0dXJuIHByb2ZpbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByb2ZpbGUsXG4gICAgICAgIGM4eV9EZXZpY2VQcm9maWxlOiB7XG4gICAgICAgICAgLi4ucHJvZmlsZS5jOHlfRGV2aWNlUHJvZmlsZSxcbiAgICAgICAgICBzb2Z0d2FyZTogcHJvZmlsZS5jOHlfRGV2aWNlUHJvZmlsZS5zb2Z0d2FyZS5tYXAoc3cgPT5cbiAgICAgICAgICAgIHBpY2tCeShzdywgKF8sIGtleSkgPT4ga2V5ICE9PSAnc29mdHdhcmVUeXBlJylcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG59XG4iLCI8Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICB0aXRsZT1cInt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwiZ2V0RGV2aWNlUHJvZmlsZXNBbmRVcGRhdGVQcm9maWxlSXRlbXMoKVwiXG4gID5cbiAgICA8aVxuICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogcmVsb2FkaW5nIH1cIlxuICAgID48L2k+XG4gICAge3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG48Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIj5cbiAgPGM4eS1yZWFsdGltZS1idG4gW3NlcnZpY2VdPVwiZGV2aWNlUmVhbHRpbWVcIj48L2M4eS1yZWFsdGltZS1idG4+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtLWdyaWQtLWZ1bGxwYWdlIGNhcmQtLWdyaWQtLWZ1bGxwYWdlIGNhcmQtLWdyaWQgZ3JpZF9fcm93LS0yLTEwLS1tZFwiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC0tZ3JpZCBncmlkX19jb2wtLTYtNi0tbWRcIj5cbiAgICA8IS0tIEFWQUlMQUJMRSBQUk9GSUxFUyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYmctbGV2ZWwtMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHNlcGFyYXRvclwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjYXJkLXRpdGxlXCJcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgPlxuICAgICAgICAgIERldmljZSBwcm9maWxlXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicC0xNlwiPlxuICAgICAgICA8Zm9ybSAjZGV2aWNlUHJvZmlsZUZvcm09XCJuZ0Zvcm1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgIDxjOHktdHlwZWFoZWFkXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleC1ncm93XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnU2VsZWN0IGRldmljZSBwcm9maWxlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIG5hbWU9XCJzZWxlY3RQcm9maWxlXCJcbiAgICAgICAgICAgICAgZGF0YS1jeT1cImRldmljZS10YWItcHJvZmlsZS0tc2VsZWN0LWRldmljZS1wcm9maWxlXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFByb2ZpbGVcIlxuICAgICAgICAgICAgICAob25TZWFyY2gpPVwic2V0UGlwZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2FsbG93RnJlZUVudHJpZXNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8Yzh5LWxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwLWwtOCBwLXItOCBjOHktbGlzdF9faXRlbS0tbGlua1wiXG4gICAgICAgICAgICAgICAgKmM4eUZvcj1cImxldCBwcm9maWxlIG9mIGRldmljZVByb2ZpbGVzOyBwaXBlOiBmaWx0ZXJQaXBlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UHJvZmlsZShwcm9maWxlKTsgc2V0UGlwZSgnJylcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGM4eS1oaWdobGlnaHRcbiAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cInByb2ZpbGUubmFtZSB8fCAnJiM0NTsmIzQ1OydcIlxuICAgICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwicGF0dGVyblwiXG4gICAgICAgICAgICAgICAgPjwvYzh5LWhpZ2hsaWdodD5cbiAgICAgICAgICAgICAgPC9jOHktbGk+XG4gICAgICAgICAgICA8L2M4eS10eXBlYWhlYWQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQXNzaWduIGRldmljZSBwcm9maWxlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNyZWF0ZU9wZXJhdGlvbigpXCJcbiAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZGV2aWNlLXRhYi1wcm9maWxlLS1Bc3NpZ24tZGV2aWNlLXByb2ZpbGUtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkUHJvZmlsZT8uaWRcIlxuICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQUk9EVUNUX0VYUEVSSUVOQ0UuQUNUSU9OUy5BU1NJR05fREVWSUNFX1BST0ZJTEUgfVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnQXNzaWduIGRldmljZSBwcm9maWxlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIElOU1RBTEwgUFJPRklMRSBPUEVSQVRJT04gLS0+XG4gICAgPGRpdiBjbGFzcz1cImJnLWxldmVsLTFcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBzZXBhcmF0b3JcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiY2FyZC10aXRsZVwiXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgID5cbiAgICAgICAgICBDdXJyZW50bHkgaW5zdGFsbGVkXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9ja1wiPlxuICAgICAgICA8Yzh5LW9wZXJhdGlvbi1kZXRhaWxzXG4gICAgICAgICAgW29wZXJhdGlvbl09XCJvcGVyYXRpb25cIlxuICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgIHN1cHByZXNzRGF0YU92ZXJyaWRpbmdcbiAgICAgICAgPjwvYzh5LW9wZXJhdGlvbi1kZXRhaWxzPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY2FyZC0tZ3JpZF9faW5uZXItc2Nyb2xsIGQtY29sIG5vLWFsaWduLWl0ZW1zXCI+XG4gICAgPGRpdiBjbGFzcz1cImQtY29udGVudHNcIj5cbiAgICAgIDwhLS0gRklSTVdBUkUgLS0+XG4gICAgICA8Yzh5LWRldmljZS10YWItcHJvZmlsZS1kZXRhaWxcbiAgICAgICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICAgICAgW3NlY3Rpb25JY29uXT1cIidjOHktZmlybXdhcmUnXCJcbiAgICAgICAgW3NlY3Rpb25UaXRsZV09XCInRmlybXdhcmUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2VtcHR5U3RhdGVUZXh0XT1cIidObyBmaXJtd2FyZSB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbZW1wdHlTdGF0ZURldGFpbHNdPVwiJ05vIGZpcm13YXJlIGFzc2lnbmVkLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbaXNQcm9maWxlU2VsZWN0ZWRdPVwiISFzZWxlY3RlZFByb2ZpbGVcIlxuICAgICAgICBbaXRlbXNdPVwiZmlybXdhcmVJdGVtc1wiXG4gICAgICAgIFtpc0VtcHR5XT1cIiFzZWxlY3RlZFByb2ZpbGU/LmM4eV9EZXZpY2VQcm9maWxlPy5maXJtd2FyZT8ubmFtZVwiXG4gICAgICA+PC9jOHktZGV2aWNlLXRhYi1wcm9maWxlLWRldGFpbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1jb250ZW50c1wiPlxuICAgICAgPCEtLSBTT0ZUV0FSRSAtLT5cbiAgICAgIDxjOHktZGV2aWNlLXRhYi1wcm9maWxlLWRldGFpbFxuICAgICAgICBjbGFzcz1cImQtY29udGVudHNcIlxuICAgICAgICBbc2VjdGlvbkljb25dPVwiJ2M4eS10b29scydcIlxuICAgICAgICBbc2VjdGlvblRpdGxlXT1cIidTb2Z0d2FyZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbZW1wdHlTdGF0ZVRleHRdPVwiJ05vIHNvZnR3YXJlIHRvIGRpc3BsYXkuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtlbXB0eVN0YXRlRGV0YWlsc109XCInTm8gc29mdHdhcmUgYXNzaWduZWQuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtpc1Byb2ZpbGVTZWxlY3RlZF09XCIhIXNlbGVjdGVkUHJvZmlsZVwiXG4gICAgICAgIFtpdGVtc109XCJzb2Z0d2FyZUl0ZW1zXCJcbiAgICAgICAgW2lzRW1wdHldPVwiXG4gICAgICAgICAgIXNlbGVjdGVkUHJvZmlsZT8uYzh5X0RldmljZVByb2ZpbGU/LnNvZnR3YXJlIHx8XG4gICAgICAgICAgc2VsZWN0ZWRQcm9maWxlPy5jOHlfRGV2aWNlUHJvZmlsZT8uc29mdHdhcmU/Lmxlbmd0aCA9PT0gMFxuICAgICAgICBcIlxuICAgICAgPjwvYzh5LWRldmljZS10YWItcHJvZmlsZS1kZXRhaWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImQtY29udGVudHNcIj5cbiAgICAgIDwhLS0gQ09ORklHVVJBVElPTiAtLT5cbiAgICAgIDxjOHktZGV2aWNlLXRhYi1wcm9maWxlLWRldGFpbFxuICAgICAgICBjbGFzcz1cImQtY29udGVudHNcIlxuICAgICAgICBbc2VjdGlvbkljb25dPVwiJ2dlYXJzJ1wiXG4gICAgICAgIFtzZWN0aW9uVGl0bGVdPVwiJ0NvbmZpZ3VyYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2VtcHR5U3RhdGVUZXh0XT1cIidObyBjb25maWd1cmF0aW9uIHRvIGRpc3BsYXknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2VtcHR5U3RhdGVEZXRhaWxzXT1cIidObyBjb25maWd1cmF0aW9uIGFzc2lnbmVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtpc1Byb2ZpbGVTZWxlY3RlZF09XCIhIXNlbGVjdGVkUHJvZmlsZVwiXG4gICAgICAgIFtpdGVtc109XCJjb25maWd1cmF0aW9uSXRlbXNcIlxuICAgICAgICBbaXNFbXB0eV09XCJcbiAgICAgICAgICAhc2VsZWN0ZWRQcm9maWxlPy5jOHlfRGV2aWNlUHJvZmlsZT8uY29uZmlndXJhdGlvbiB8fFxuICAgICAgICAgIHNlbGVjdGVkUHJvZmlsZT8uYzh5X0RldmljZVByb2ZpbGU/LmNvbmZpZ3VyYXRpb24/Lmxlbmd0aCA9PT0gMFxuICAgICAgICBcIlxuICAgICAgPjwvYzh5LWRldmljZS10YWItcHJvZmlsZS1kZXRhaWw+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBmaWxsIGluIHRoZSByZW1hbmluaW5nIHZlcnRpY2FsIHNwYWNlIHdoZW4gZW1wdHkgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtLWdyaWQgZ3JpZF9fY29sLS02LTYtLW1kIGZsZXgtZ3Jvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImJnLWxldmVsLTBcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJiZy1sZXZlbC0xXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLXRhYi1wcm9maWxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2RldmljZS1wcm9maWxlL2RldmljZS10YWItcHJvZmlsZS9kZXZpY2UtdGFiLXByb2ZpbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vZGV2aWNlLXByb2ZpbGUvZGV2aWNlLXRhYi1wcm9maWxlL2RldmljZS10YWItcHJvZmlsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQ0wsWUFBWSxFQUVaLE9BQU8sRUFDUCw0QkFBNEIsRUFDNUIsd0JBQXdCLEVBQ3hCLCtCQUErQixFQUdoQyxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUdMLGlDQUFpQyxFQUNsQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7QUFhakUsTUFBTSxPQUFPLHlCQUF5QjtJQXFCcEMsWUFDUyxjQUE0QyxFQUMzQyxvQkFBMEMsRUFDMUMsS0FBcUIsRUFDckIsaUJBQTJDLEVBQzNDLFlBQTBCO1FBSjNCLG1CQUFjLEdBQWQsY0FBYyxDQUE4QjtRQUMzQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBMEI7UUFDM0MsaUJBQVksR0FBWixZQUFZLENBQWM7UUF6QnBDLHVCQUFrQixHQUFHLGlDQUFpQyxDQUFDO1FBS3ZELGtCQUFhLEdBQXVCLEVBQUUsQ0FBQztRQUN2QyxrQkFBYSxHQUF1QixFQUFFLENBQUM7UUFDdkMsdUJBQWtCLEdBQXVCLEVBQUUsQ0FBQztRQUc1QyxhQUFRLEdBQUcsSUFBSSxlQUFlLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDM0MsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFVLElBQUksQ0FBQyxDQUFDO1FBQzdDLDJCQUFzQixHQUEyQjtZQUMvQyxTQUFTLEVBQUUsaUNBQWlDLENBQUMsTUFBTSxDQUFDLFVBQVU7WUFDOUQsSUFBSSxFQUFFO2dCQUNKLFNBQVMsRUFBRSxpQ0FBaUMsQ0FBQyxVQUFVLENBQUMsa0JBQWtCO2FBQzNFO1NBQ0YsQ0FBQztRQUNNLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFTdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1RCxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVE7UUFDWixJQUFJLENBQUMsc0NBQXNDLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNqQyxNQUFNLHNCQUFzQixHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUMvRSxNQUFNLFFBQVEsR0FBRyxDQUFDLFlBQXNCLEVBQUUsRUFBRTtZQUMxQyxPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FDcEIsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1QsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsRUFBOEIsQ0FBQyxDQUFDLENBQ3JGLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsc0NBQXNDO1FBQzFDLElBQUksQ0FBQyxlQUFlLEdBQUcsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM1RixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQ3RCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUN2RSxFQUNELEdBQUcsQ0FBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEVBQUU7WUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM1QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JGLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNuQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3BDLENBQUM7SUFDSixDQUFDO0lBRUQsYUFBYSxDQUFDLEVBQWlCO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWU7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FDckUsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsZUFBZSxDQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQU0sRUFBRSxPQUFPO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVPLHlCQUF5QjtRQUMvQixJQUFJLENBQUMsY0FBYzthQUNoQixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7YUFDekIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN6QyxTQUFTLENBQUMsQ0FBQyxhQUE2QixFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsY0FBYzthQUNoQixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7YUFDekIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN6QyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3RCLE9BQU8sQ0FDTCxzRkFBc0YsQ0FDdkYsQ0FDRixDQUFDO1lBQ0YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixJQUFJLENBQUMsaUJBQWlCO2FBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzthQUN0QixJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBa0IsQ0FBQyxFQUNyQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsRUFDaEQsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUNwQzthQUNBLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxPQUFzQjtRQUMvQyxJQUNFLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNuRSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSw0QkFBNEIsQ0FBQyxFQUM5QyxDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPO2dCQUNMLEdBQUcsT0FBTztnQkFDVixpQkFBaUIsRUFBRTtvQkFDakIsR0FBRyxPQUFPLENBQUMsaUJBQWlCO29CQUM1QixRQUFRLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FDcEQsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxjQUFjLENBQUMsQ0FDL0M7aUJBQ0Y7YUFDRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7OEdBMUlVLHlCQUF5QjtrR0FBekIseUJBQXlCLGlEQVJ6QjtZQUNULDRCQUE0QjtZQUM1QjtnQkFDRSxPQUFPLEVBQUUsK0JBQStCO2dCQUN4QyxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHlCQUF5QixDQUFDO2FBQ3pEO1NBQ0YsMEJDakNILHN1S0FrSkE7OzJGRC9HYSx5QkFBeUI7a0JBWHJDLFNBQVM7K0JBQ0Usd0JBQXdCLGFBRXZCO3dCQUNULDRCQUE0Qjt3QkFDNUI7NEJBQ0UsT0FBTyxFQUFFLCtCQUErQjs0QkFDeEMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLENBQUM7eUJBQ3pEO3FCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBmb3J3YXJkUmVmLCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIElPcGVyYXRpb24sIElSZXN1bHRMaXN0IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBGb3JPZkZpbHRlclBpcGUsXG4gIGdldHRleHQsXG4gIE1hbmFnZWRPYmplY3RSZWFsdGltZVNlcnZpY2UsXG4gIE9wZXJhdGlvblJlYWx0aW1lU2VydmljZSxcbiAgUFJPRFVDVF9FWFBFUklFTkNFX0VWRU5UX1NPVVJDRSxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudCxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudFNvdXJjZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IGhhcywgcGlja0J5IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgcGlwZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQ29tcGFyaXNvblJlc3VsdCxcbiAgRGV2aWNlUHJvZmlsZSxcbiAgUFJPRFVDVF9FWFBFUklFTkNFX0RFVklDRV9QUk9GSUxFXG59IGZyb20gJy4uL2RldmljZS1wcm9maWxlLm1vZGVsJztcbmltcG9ydCB7IERldmljZVByb2ZpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vZGV2aWNlLXByb2ZpbGUuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kZXZpY2UtdGFiLXByb2ZpbGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGV2aWNlLXRhYi1wcm9maWxlLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgTWFuYWdlZE9iamVjdFJlYWx0aW1lU2VydmljZSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBQUk9EVUNUX0VYUEVSSUVOQ0VfRVZFTlRfU09VUkNFLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGV2aWNlVGFiUHJvZmlsZUNvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGV2aWNlVGFiUHJvZmlsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgUHJvZHVjdEV4cGVyaWVuY2VFdmVudFNvdXJjZSB7XG4gIFBST0RVQ1RfRVhQRVJJRU5DRSA9IFBST0RVQ1RfRVhQRVJJRU5DRV9ERVZJQ0VfUFJPRklMRTtcbiAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdDtcbiAgZGV2aWNlUHJvZmlsZXMkOiBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PElNYW5hZ2VkT2JqZWN0Pj47XG4gIHNlbGVjdGVkUHJvZmlsZTogUGFydGlhbDxEZXZpY2VQcm9maWxlPjtcbiAgb3BlcmF0aW9uOiBJT3BlcmF0aW9uO1xuICBmaXJtd2FyZUl0ZW1zOiBDb21wYXJpc29uUmVzdWx0W10gPSBbXTtcbiAgc29mdHdhcmVJdGVtczogQ29tcGFyaXNvblJlc3VsdFtdID0gW107XG4gIGNvbmZpZ3VyYXRpb25JdGVtczogQ29tcGFyaXNvblJlc3VsdFtdID0gW107XG5cbiAgZmlsdGVyUGlwZTogRm9yT2ZGaWx0ZXJQaXBlO1xuICBwYXR0ZXJuJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHJlbG9hZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICBwcm9kdWN0RXhwZXJpZW5jZUV2ZW50OiBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50ID0ge1xuICAgIGV2ZW50TmFtZTogUFJPRFVDVF9FWFBFUklFTkNFX0RFVklDRV9QUk9GSUxFLkVWRU5UUy5ERVZJQ0VfVEFCLFxuICAgIGRhdGE6IHtcbiAgICAgIGNvbXBvbmVudDogUFJPRFVDVF9FWFBFUklFTkNFX0RFVklDRV9QUk9GSUxFLkNPTVBPTkVOVFMuREVWSUNFX1RBQl9QUk9GSUxFXG4gICAgfVxuICB9O1xuICBwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRldmljZVJlYWx0aW1lOiBNYW5hZ2VkT2JqZWN0UmVhbHRpbWVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGV2aWNlUHJvZmlsZVNlcnZpY2U6IERldmljZVByb2ZpbGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgb3BlcmF0aW9uUmVhbHRpbWU6IE9wZXJhdGlvblJlYWx0aW1lU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuZGV2aWNlID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJlbnQuZGF0YS5jb250ZXh0RGF0YTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZ2V0RGV2aWNlUHJvZmlsZXNBbmRVcGRhdGVQcm9maWxlSXRlbXMoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvTWFuYWdlZE9iamVjdHMoKTtcbiAgICBjb25zdCBzdXBwb3J0ZWRTb2Z0d2FyZVR5cGVzID0gbmV3IFNldCh0aGlzLmRldmljZS5jOHlfU3VwcG9ydGVkU29mdHdhcmVUeXBlcyk7XG4gICAgY29uc3QgaXNTdWJzZXQgPSAocHJvZmlsZVR5cGVzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgcmV0dXJuIHByb2ZpbGVUeXBlcy5ldmVyeSh0eXBlID0+IHN1cHBvcnRlZFNvZnR3YXJlVHlwZXMuaGFzKHR5cGUpKTtcbiAgICB9O1xuICAgIHRoaXMuZmlsdGVyUGlwZSA9IHBpcGUoXG4gICAgICBtYXAoZGF0YSA9PiB7XG4gICAgICAgIGlmIChzdXBwb3J0ZWRTb2Z0d2FyZVR5cGVzLnNpemUpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5maWx0ZXIobW8gPT5cbiAgICAgICAgICAgIGlzU3Vic2V0KHRoaXMuZGV2aWNlUHJvZmlsZVNlcnZpY2UuZ2V0U29mdHdhcmVUeXBlcyhtbyBhcyB1bmtub3duIGFzIERldmljZVByb2ZpbGUpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldERldmljZVByb2ZpbGVzQW5kVXBkYXRlUHJvZmlsZUl0ZW1zKCkge1xuICAgIHRoaXMuZGV2aWNlUHJvZmlsZXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5yZWxvYWQkLnBpcGUoZmlsdGVyKEJvb2xlYW4pKSwgdGhpcy5wYXR0ZXJuJF0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKFtfLCBuYW1lXSkgPT5cbiAgICAgICAgdGhpcy5kZXZpY2VQcm9maWxlU2VydmljZS5nZXREZXZpY2VQcm9maWxlc0J5RGV2aWNlKHRoaXMuZGV2aWNlLCBuYW1lKVxuICAgICAgKSxcbiAgICAgIHRhcChhc3luYyBwcm9maWxlcyA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRldmljZS5jOHlfUHJvZmlsZSkge1xuICAgICAgICAgIGNvbnN0IHByb2ZpbGVJZCA9IHRoaXMuZGV2aWNlLmM4eV9Qcm9maWxlLnByb2ZpbGVJZDtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUHJvZmlsZSA9IHByb2ZpbGVzLmRhdGEuZmluZChtbyA9PiBtby5pZCA9PT0gcHJvZmlsZUlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVByb2ZpbGVJdGVtcyh0aGlzLmRldmljZSwgdGhpcy5zZWxlY3RlZFByb2ZpbGUpO1xuICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IGF3YWl0IHRoaXMuZGV2aWNlUHJvZmlsZVNlcnZpY2UuZ2V0UHJvZmlsZU9wZXJhdGlvbih0aGlzLmRldmljZS5pZCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlVG9PcGVyYXRpb25zKCk7XG4gICAgICB9KSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnJlbG9hZCQubmV4dChmYWxzZSkpLFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICApO1xuICB9XG5cbiAgc2VsZWN0UHJvZmlsZShtbzogRGV2aWNlUHJvZmlsZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRQcm9maWxlID0gdGhpcy50b1Byb2ZpbGVGb3JEZXZpY2UobW8pO1xuICAgIHRoaXMudXBkYXRlUHJvZmlsZUl0ZW1zKHRoaXMuZGV2aWNlLCB0aGlzLnNlbGVjdGVkUHJvZmlsZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVPcGVyYXRpb24oKSB7XG4gICAgdGhpcy5vcGVyYXRpb24gPSBhd2FpdCB0aGlzLmRldmljZVByb2ZpbGVTZXJ2aWNlLmNyZWF0ZVByb2ZpbGVPcGVyYXRpb24oXG4gICAgICB0aGlzLmRldmljZSxcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcm9maWxlXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZVByb2ZpbGVJdGVtcyhkZXZpY2UsIHByb2ZpbGUpIHtcbiAgICB0aGlzLmZpcm13YXJlSXRlbXMgPSB0aGlzLmRldmljZVByb2ZpbGVTZXJ2aWNlLmdldEZpcm13YXJlSXRlbXMoZGV2aWNlLCBwcm9maWxlKTtcbiAgICB0aGlzLnNvZnR3YXJlSXRlbXMgPSB0aGlzLmRldmljZVByb2ZpbGVTZXJ2aWNlLmdldFNvZnR3YXJlSXRlbXMoZGV2aWNlLCBwcm9maWxlKTtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb25JdGVtcyA9IHRoaXMuZGV2aWNlUHJvZmlsZVNlcnZpY2UuZ2V0Q29uZmlndXJhdGlvbkl0ZW1zKGRldmljZSwgcHJvZmlsZSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvTWFuYWdlZE9iamVjdHMoKSB7XG4gICAgdGhpcy5kZXZpY2VSZWFsdGltZVxuICAgICAgLm9uVXBkYXRlJCh0aGlzLmRldmljZS5pZClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgobWFuYWdlZE9iamVjdDogSU1hbmFnZWRPYmplY3QpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVQcm9maWxlSXRlbXMobWFuYWdlZE9iamVjdCwgdGhpcy5zZWxlY3RlZFByb2ZpbGUpO1xuICAgICAgfSk7XG4gICAgdGhpcy5kZXZpY2VSZWFsdGltZVxuICAgICAgLm9uRGVsZXRlJCh0aGlzLmRldmljZS5pZClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmRhbmdlcihcbiAgICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgICAgJ1RoaXMgZGV2aWNlIGhhcyBqdXN0IGJlZW4gZGVsZXRlZC4gWW91IHdpbGwgYmUgcmVkaXJlY3RlZCB0byBcIkFsbCBkZXZpY2VzXCIgcGFnZSBub3cuJ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnIy9kZXZpY2UnO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvT3BlcmF0aW9ucygpIHtcbiAgICB0aGlzLm9wZXJhdGlvblJlYWx0aW1lXG4gICAgICAub25BbGwkKHRoaXMuZGV2aWNlLmlkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoeyBkYXRhIH0pID0+IGRhdGEgYXMgSU9wZXJhdGlvbiksXG4gICAgICAgIGZpbHRlcihvcGVyYXRpb24gPT4gb3BlcmF0aW9uLmM4eV9EZXZpY2VQcm9maWxlKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUob3BlcmF0aW9uID0+IHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdG9Qcm9maWxlRm9yRGV2aWNlKHByb2ZpbGU6IERldmljZVByb2ZpbGUpOiBEZXZpY2VQcm9maWxlIHtcbiAgICBpZiAoXG4gICAgICBBcnJheS5mcm9tKHByb2ZpbGU/LmM4eV9EZXZpY2VQcm9maWxlPy5zb2Z0d2FyZSB8fCBbXSkubGVuZ3RoID09PSAwIHx8XG4gICAgICBoYXModGhpcy5kZXZpY2UsICdjOHlfU3VwcG9ydGVkU29mdHdhcmVUeXBlcycpXG4gICAgKSB7XG4gICAgICByZXR1cm4gcHJvZmlsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucHJvZmlsZSxcbiAgICAgICAgYzh5X0RldmljZVByb2ZpbGU6IHtcbiAgICAgICAgICAuLi5wcm9maWxlLmM4eV9EZXZpY2VQcm9maWxlLFxuICAgICAgICAgIHNvZnR3YXJlOiBwcm9maWxlLmM4eV9EZXZpY2VQcm9maWxlLnNvZnR3YXJlLm1hcChzdyA9PlxuICAgICAgICAgICAgcGlja0J5KHN3LCAoXywga2V5KSA9PiBrZXkgIT09ICdzb2Z0d2FyZVR5cGUnKVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiIsIjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIHRpdGxlPVwie3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIChjbGljayk9XCJyZWxvYWQkLm5leHQodHJ1ZSlcIlxuICA+XG4gICAgPGlcbiAgICAgIGM4eUljb249XCJyZWZyZXNoXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2ljb24tc3Bpbic6IHJlbG9hZCQudmFsdWUgfVwiXG4gICAgPjwvaT5cbiAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiPlxuICA8Yzh5LXJlYWx0aW1lLWJ0biBbc2VydmljZV09XCJkZXZpY2VSZWFsdGltZVwiPjwvYzh5LXJlYWx0aW1lLWJ0bj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGRpdiBjbGFzcz1cImNhcmQgY2FyZC0tZ3JpZC0tZnVsbHBhZ2UgY2FyZC0tZ3JpZC0tZnVsbHBhZ2UgY2FyZC0tZ3JpZCBncmlkX19yb3ctLTItMTAtLW1kXCI+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLS1ncmlkIGdyaWRfX2NvbC0tNi02LS1tZFwiPlxuICAgIDwhLS0gQVZBSUxBQkxFIFBST0ZJTEVTIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJiZy1sZXZlbC0wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgc2VwYXJhdG9yXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNhcmQtdGl0bGVcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgRGV2aWNlIHByb2ZpbGVcbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLTE2XCI+XG4gICAgICAgIDxmb3JtICNkZXZpY2VQcm9maWxlRm9ybT1cIm5nRm9ybVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgPGM4eS10eXBlYWhlYWRcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4LWdyb3dcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdTZWxlY3QgZGV2aWNlIHByb2ZpbGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgbmFtZT1cInNlbGVjdFByb2ZpbGVcIlxuICAgICAgICAgICAgICBkYXRhLWN5PVwiZGV2aWNlLXRhYi1wcm9maWxlLS1zZWxlY3QtZGV2aWNlLXByb2ZpbGVcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkUHJvZmlsZVwiXG4gICAgICAgICAgICAgIChvblNlYXJjaCk9XCJwYXR0ZXJuJC5uZXh0KCRldmVudClcIlxuICAgICAgICAgICAgICBbYWxsb3dGcmVlRW50cmllc109XCJmYWxzZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxjOHktbGlcbiAgICAgICAgICAgICAgICBjbGFzcz1cInAtbC04IHAtci04IGM4eS1saXN0X19pdGVtLS1saW5rXCJcbiAgICAgICAgICAgICAgICAqYzh5Rm9yPVwibGV0IHByb2ZpbGUgb2YgZGV2aWNlUHJvZmlsZXMkOyBwaXBlOiBmaWx0ZXJQaXBlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UHJvZmlsZShwcm9maWxlKTsgcGF0dGVybiQubmV4dCgnJylcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGM4eS1oaWdobGlnaHRcbiAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cInByb2ZpbGUubmFtZSB8fCAnJiM0NTsmIzQ1OydcIlxuICAgICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwicGF0dGVybiQudmFsdWVcIlxuICAgICAgICAgICAgICAgID48L2M4eS1oaWdobGlnaHQ+XG4gICAgICAgICAgICAgIDwvYzh5LWxpPlxuICAgICAgICAgICAgPC9jOHktdHlwZWFoZWFkPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0Fzc2lnbiBkZXZpY2UgcHJvZmlsZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVPcGVyYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgZGF0YS1jeT1cImRldmljZS10YWItcHJvZmlsZS0tQXNzaWduLWRldmljZS1wcm9maWxlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZFByb2ZpbGU/LmlkXCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFJPRFVDVF9FWFBFUklFTkNFLkFDVElPTlMuQVNTSUdOX0RFVklDRV9QUk9GSUxFIH1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ0Fzc2lnbiBkZXZpY2UgcHJvZmlsZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBJTlNUQUxMIFBST0ZJTEUgT1BFUkFUSU9OIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJiZy1sZXZlbC0xXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgc2VwYXJhdG9yXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNhcmQtdGl0bGVcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgQ3VycmVudGx5IGluc3RhbGxlZFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2tcIj5cbiAgICAgICAgPGM4eS1vcGVyYXRpb24tZGV0YWlsc1xuICAgICAgICAgIFtvcGVyYXRpb25dPVwib3BlcmF0aW9uXCJcbiAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICBzdXBwcmVzc0RhdGFPdmVycmlkaW5nXG4gICAgICAgID48L2M4eS1vcGVyYXRpb24tZGV0YWlscz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtLWdyaWRfX2lubmVyLXNjcm9sbCBkLWNvbCBuby1hbGlnbi1pdGVtc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWNvbnRlbnRzXCI+XG4gICAgICA8IS0tIEZJUk1XQVJFIC0tPlxuICAgICAgPGM4eS1kZXZpY2UtdGFiLXByb2ZpbGUtZGV0YWlsXG4gICAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgICAgIFtzZWN0aW9uSWNvbl09XCInYzh5LWZpcm13YXJlJ1wiXG4gICAgICAgIFtzZWN0aW9uVGl0bGVdPVwiJ0Zpcm13YXJlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtlbXB0eVN0YXRlVGV4dF09XCInTm8gZmlybXdhcmUgdG8gZGlzcGxheS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2VtcHR5U3RhdGVEZXRhaWxzXT1cIidObyBmaXJtd2FyZSBhc3NpZ25lZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2lzUHJvZmlsZVNlbGVjdGVkXT1cIiEhc2VsZWN0ZWRQcm9maWxlXCJcbiAgICAgICAgW2l0ZW1zXT1cImZpcm13YXJlSXRlbXNcIlxuICAgICAgICBbaXNFbXB0eV09XCIhc2VsZWN0ZWRQcm9maWxlPy5jOHlfRGV2aWNlUHJvZmlsZT8uZmlybXdhcmU/Lm5hbWVcIlxuICAgICAgPjwvYzh5LWRldmljZS10YWItcHJvZmlsZS1kZXRhaWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImQtY29udGVudHNcIj5cbiAgICAgIDwhLS0gU09GVFdBUkUgLS0+XG4gICAgICA8Yzh5LWRldmljZS10YWItcHJvZmlsZS1kZXRhaWxcbiAgICAgICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICAgICAgW3NlY3Rpb25JY29uXT1cIidjOHktdG9vbHMnXCJcbiAgICAgICAgW3NlY3Rpb25UaXRsZV09XCInU29mdHdhcmUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2VtcHR5U3RhdGVUZXh0XT1cIidObyBzb2Z0d2FyZSB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbZW1wdHlTdGF0ZURldGFpbHNdPVwiJ05vIHNvZnR3YXJlIGFzc2lnbmVkLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbaXNQcm9maWxlU2VsZWN0ZWRdPVwiISFzZWxlY3RlZFByb2ZpbGVcIlxuICAgICAgICBbaXRlbXNdPVwic29mdHdhcmVJdGVtc1wiXG4gICAgICAgIFtpc0VtcHR5XT1cIlxuICAgICAgICAgICFzZWxlY3RlZFByb2ZpbGU/LmM4eV9EZXZpY2VQcm9maWxlPy5zb2Z0d2FyZSB8fFxuICAgICAgICAgIHNlbGVjdGVkUHJvZmlsZT8uYzh5X0RldmljZVByb2ZpbGU/LnNvZnR3YXJlPy5sZW5ndGggPT09IDBcbiAgICAgICAgXCJcbiAgICAgID48L2M4eS1kZXZpY2UtdGFiLXByb2ZpbGUtZGV0YWlsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkLWNvbnRlbnRzXCI+XG4gICAgICA8IS0tIENPTkZJR1VSQVRJT04gLS0+XG4gICAgICA8Yzh5LWRldmljZS10YWItcHJvZmlsZS1kZXRhaWxcbiAgICAgICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICAgICAgW3NlY3Rpb25JY29uXT1cIidnZWFycydcIlxuICAgICAgICBbc2VjdGlvblRpdGxlXT1cIidDb25maWd1cmF0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtlbXB0eVN0YXRlVGV4dF09XCInTm8gY29uZmlndXJhdGlvbiB0byBkaXNwbGF5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtlbXB0eVN0YXRlRGV0YWlsc109XCInTm8gY29uZmlndXJhdGlvbiBhc3NpZ25lZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbaXNQcm9maWxlU2VsZWN0ZWRdPVwiISFzZWxlY3RlZFByb2ZpbGVcIlxuICAgICAgICBbaXRlbXNdPVwiY29uZmlndXJhdGlvbkl0ZW1zXCJcbiAgICAgICAgW2lzRW1wdHldPVwiXG4gICAgICAgICAgIXNlbGVjdGVkUHJvZmlsZT8uYzh5X0RldmljZVByb2ZpbGU/LmNvbmZpZ3VyYXRpb24gfHxcbiAgICAgICAgICBzZWxlY3RlZFByb2ZpbGU/LmM4eV9EZXZpY2VQcm9maWxlPy5jb25maWd1cmF0aW9uPy5sZW5ndGggPT09IDBcbiAgICAgICAgXCJcbiAgICAgID48L2M4eS1kZXZpY2UtdGFiLXByb2ZpbGUtZGV0YWlsPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gZmlsbCBpbiB0aGUgcmVtYW5pbmluZyB2ZXJ0aWNhbCBzcGFjZSB3aGVuIGVtcHR5IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLS1ncmlkIGdyaWRfX2NvbC0tNi02LS1tZCBmbGV4LWdyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJiZy1sZXZlbC0wXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYmctbGV2ZWwtMVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|