@aws-amplify/backend-notifications 0.0.0-test-20260708085627

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.
Files changed (59) hide show
  1. package/README.md +235 -0
  2. package/lib/campaign-association-asset/index.js +48413 -0
  3. package/lib/constants.d.ts +122 -0
  4. package/lib/constants.js +125 -0
  5. package/lib/construct.d.ts +283 -0
  6. package/lib/construct.js +824 -0
  7. package/lib/factory.d.ts +53 -0
  8. package/lib/factory.js +158 -0
  9. package/lib/handler-asset/index.js +530 -0
  10. package/lib/index.d.ts +7 -0
  11. package/lib/index.js +5 -0
  12. package/lib/lambda/campaign-association/handler.d.ts +29 -0
  13. package/lib/lambda/campaign-association/handler.js +80 -0
  14. package/lib/lambda/campaign-association/integration.d.ts +59 -0
  15. package/lib/lambda/campaign-association/integration.js +108 -0
  16. package/lib/lambda/campaign-association/onboarding.d.ts +25 -0
  17. package/lib/lambda/campaign-association/onboarding.js +74 -0
  18. package/lib/lambda/identify/device_resolver.d.ts +18 -0
  19. package/lib/lambda/identify/device_resolver.js +56 -0
  20. package/lib/lambda/identify/handler.d.ts +17 -0
  21. package/lib/lambda/identify/handler.js +124 -0
  22. package/lib/lambda/identify/mapping.d.ts +61 -0
  23. package/lib/lambda/identify/mapping.js +171 -0
  24. package/lib/lambda/identify/merge_resolver.d.ts +26 -0
  25. package/lib/lambda/identify/merge_resolver.js +36 -0
  26. package/lib/lambda/identify/principal.d.ts +68 -0
  27. package/lib/lambda/identify/principal.js +48 -0
  28. package/lib/lambda/identify/profile_resolver.d.ts +35 -0
  29. package/lib/lambda/identify/profile_resolver.js +65 -0
  30. package/lib/lambda/identify/types.d.ts +90 -0
  31. package/lib/lambda/identify/types.js +10 -0
  32. package/lib/lambda/identify/validation.d.ts +15 -0
  33. package/lib/lambda/identify/validation.js +99 -0
  34. package/lib/lambda/push/delivery.d.ts +49 -0
  35. package/lib/lambda/push/delivery.js +120 -0
  36. package/lib/lambda/push/device_lookup.d.ts +35 -0
  37. package/lib/lambda/push/device_lookup.js +88 -0
  38. package/lib/lambda/push/eum_client.d.ts +31 -0
  39. package/lib/lambda/push/eum_client.js +140 -0
  40. package/lib/lambda/push/event.d.ts +32 -0
  41. package/lib/lambda/push/event.js +122 -0
  42. package/lib/lambda/push/fixtures/real_journey_event.d.ts +19 -0
  43. package/lib/lambda/push/fixtures/real_journey_event.js +22 -0
  44. package/lib/lambda/push/handler.d.ts +15 -0
  45. package/lib/lambda/push/handler.js +86 -0
  46. package/lib/lambda/push/message_template.d.ts +72 -0
  47. package/lib/lambda/push/message_template.js +270 -0
  48. package/lib/lambda/push/payload.d.ts +25 -0
  49. package/lib/lambda/push/payload.js +53 -0
  50. package/lib/lambda/push/types.d.ts +153 -0
  51. package/lib/lambda/push/types.js +4 -0
  52. package/lib/lambda/shared/retry.d.ts +18 -0
  53. package/lib/lambda/shared/retry.js +45 -0
  54. package/lib/object_types.d.ts +63 -0
  55. package/lib/object_types.js +131 -0
  56. package/lib/push-handler-asset/index.js +75517 -0
  57. package/lib/types.d.ts +125 -0
  58. package/lib/types.js +2 -0
  59. package/package.json +49 -0
@@ -0,0 +1,45 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Customer Profiles serializes writes to a single profile: concurrent
5
+ * UpdateProfile / PutProfileObject calls against the same profile fail with a
6
+ * `BadRequestException: Failed to update profile due to concurrent update
7
+ * in-progress.` This is a TRANSIENT, idempotent condition (the write is safe to
8
+ * repeat), so the correct handling is a short bounded retry with jittered
9
+ * backoff rather than surfacing a 5xx to the caller.
10
+ */
11
+ export const isTransientConcurrentUpdate = (err) => {
12
+ const name = err?.name ?? '';
13
+ const msg = err?.message ?? '';
14
+ return (((name === 'BadRequestException' ||
15
+ name === 'ThrottlingException' ||
16
+ name === 'TooManyRequestsException') &&
17
+ /concurrent update in-progress|too many requests|rate exceeded/i.test(msg)) ||
18
+ name === 'ThrottlingException' ||
19
+ name === 'TooManyRequestsException');
20
+ };
21
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
22
+ /**
23
+ * Run `fn`, retrying on transient concurrent-update / throttling errors with
24
+ * exponential backoff + full jitter. Non-transient errors propagate immediately.
25
+ */
26
+ export const withTransientRetry = async (fn, opts = {}) => {
27
+ const attempts = opts.attempts ?? 6;
28
+ const baseDelayMs = opts.baseDelayMs ?? 80;
29
+ let lastErr;
30
+ for (let i = 0; i < attempts; i++) {
31
+ try {
32
+ return await fn();
33
+ }
34
+ catch (err) {
35
+ lastErr = err;
36
+ if (!isTransientConcurrentUpdate(err) || i === attempts - 1) {
37
+ throw err;
38
+ }
39
+ const ceiling = baseDelayMs * 2 ** i;
40
+ await sleep(Math.floor(Math.random() * ceiling));
41
+ }
42
+ }
43
+ throw lastErr;
44
+ };
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhL3NoYXJlZC9yZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBRXRDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLEdBQVksRUFBVyxFQUFFO0lBQ25FLE1BQU0sSUFBSSxHQUFJLEdBQXlCLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNwRCxNQUFNLEdBQUcsR0FBSSxHQUE0QixFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDekQsT0FBTyxDQUNMLENBQUMsQ0FBQyxJQUFJLEtBQUsscUJBQXFCO1FBQzlCLElBQUksS0FBSyxxQkFBcUI7UUFDOUIsSUFBSSxLQUFLLDBCQUEwQixDQUFDO1FBQ3BDLGdFQUFnRSxDQUFDLElBQUksQ0FDbkUsR0FBRyxDQUNKLENBQUM7UUFDSixJQUFJLEtBQUsscUJBQXFCO1FBQzlCLElBQUksS0FBSywwQkFBMEIsQ0FDcEMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sS0FBSyxHQUFHLENBQUMsRUFBVSxFQUFpQixFQUFFLENBQzFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFcEQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUNyQyxFQUFvQixFQUNwQixPQUFvRCxFQUFFLEVBQzFDLEVBQUU7SUFDZCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztJQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztJQUMzQyxJQUFJLE9BQWdCLENBQUM7SUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE9BQU8sR0FBRyxHQUFHLENBQUM7WUFDZCxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUQsTUFBTSxHQUFHLENBQUM7WUFDWixDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sT0FBTyxDQUFDO0FBQ2hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBDdXN0b21lciBQcm9maWxlcyBzZXJpYWxpemVzIHdyaXRlcyB0byBhIHNpbmdsZSBwcm9maWxlOiBjb25jdXJyZW50XG4gKiBVcGRhdGVQcm9maWxlIC8gUHV0UHJvZmlsZU9iamVjdCBjYWxscyBhZ2FpbnN0IHRoZSBzYW1lIHByb2ZpbGUgZmFpbCB3aXRoIGFcbiAqIGBCYWRSZXF1ZXN0RXhjZXB0aW9uOiBGYWlsZWQgdG8gdXBkYXRlIHByb2ZpbGUgZHVlIHRvIGNvbmN1cnJlbnQgdXBkYXRlXG4gKiBpbi1wcm9ncmVzcy5gIFRoaXMgaXMgYSBUUkFOU0lFTlQsIGlkZW1wb3RlbnQgY29uZGl0aW9uICh0aGUgd3JpdGUgaXMgc2FmZSB0b1xuICogcmVwZWF0KSwgc28gdGhlIGNvcnJlY3QgaGFuZGxpbmcgaXMgYSBzaG9ydCBib3VuZGVkIHJldHJ5IHdpdGggaml0dGVyZWRcbiAqIGJhY2tvZmYgcmF0aGVyIHRoYW4gc3VyZmFjaW5nIGEgNXh4IHRvIHRoZSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1RyYW5zaWVudENvbmN1cnJlbnRVcGRhdGUgPSAoZXJyOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG5hbWUgPSAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZSA/PyAnJztcbiAgY29uc3QgbXNnID0gKGVyciBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSk/Lm1lc3NhZ2UgPz8gJyc7XG4gIHJldHVybiAoXG4gICAgKChuYW1lID09PSAnQmFkUmVxdWVzdEV4Y2VwdGlvbicgfHxcbiAgICAgIG5hbWUgPT09ICdUaHJvdHRsaW5nRXhjZXB0aW9uJyB8fFxuICAgICAgbmFtZSA9PT0gJ1Rvb01hbnlSZXF1ZXN0c0V4Y2VwdGlvbicpICYmXG4gICAgICAvY29uY3VycmVudCB1cGRhdGUgaW4tcHJvZ3Jlc3N8dG9vIG1hbnkgcmVxdWVzdHN8cmF0ZSBleGNlZWRlZC9pLnRlc3QoXG4gICAgICAgIG1zZyxcbiAgICAgICkpIHx8XG4gICAgbmFtZSA9PT0gJ1Rocm90dGxpbmdFeGNlcHRpb24nIHx8XG4gICAgbmFtZSA9PT0gJ1Rvb01hbnlSZXF1ZXN0c0V4Y2VwdGlvbidcbiAgKTtcbn07XG5cbmNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+ID0+XG4gIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5cbi8qKlxuICogUnVuIGBmbmAsIHJldHJ5aW5nIG9uIHRyYW5zaWVudCBjb25jdXJyZW50LXVwZGF0ZSAvIHRocm90dGxpbmcgZXJyb3JzIHdpdGhcbiAqIGV4cG9uZW50aWFsIGJhY2tvZmYgKyBmdWxsIGppdHRlci4gTm9uLXRyYW5zaWVudCBlcnJvcnMgcHJvcGFnYXRlIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgY29uc3Qgd2l0aFRyYW5zaWVudFJldHJ5ID0gYXN5bmMgPFQ+KFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPixcbiAgb3B0czogeyBhdHRlbXB0cz86IG51bWJlcjsgYmFzZURlbGF5TXM/OiBudW1iZXIgfSA9IHt9LFxuKTogUHJvbWlzZTxUPiA9PiB7XG4gIGNvbnN0IGF0dGVtcHRzID0gb3B0cy5hdHRlbXB0cyA/PyA2O1xuICBjb25zdCBiYXNlRGVsYXlNcyA9IG9wdHMuYmFzZURlbGF5TXMgPz8gODA7XG4gIGxldCBsYXN0RXJyOiB1bmtub3duO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dGVtcHRzOyBpKyspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsYXN0RXJyID0gZXJyO1xuICAgICAgaWYgKCFpc1RyYW5zaWVudENvbmN1cnJlbnRVcGRhdGUoZXJyKSB8fCBpID09PSBhdHRlbXB0cyAtIDEpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgY29uc3QgY2VpbGluZyA9IGJhc2VEZWxheU1zICogMiAqKiBpO1xuICAgICAgYXdhaXQgc2xlZXAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2VpbGluZykpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBsYXN0RXJyO1xufTtcbiJdfQ==
@@ -0,0 +1,63 @@
1
+ import type { CfnObjectType } from 'aws-cdk-lib/aws-customerprofiles';
2
+ export type FieldMap = CfnObjectType.FieldMapProperty;
3
+ export type KeyMap = CfnObjectType.KeyMapProperty;
4
+ /**
5
+ * AmplifyProfile — the AUTHENTICATED person profile object type.
6
+ *
7
+ * Single searchable identity key `cognitoUserKey` (PROFILE + UNIQUE) sourced
8
+ * from `cognitoSub`. The Lambda ingests a minimal `{cognitoSub}` object via
9
+ * PutProfileObject purely for the atomic find-or-create by that UNIQUE key;
10
+ * person / targeting attributes are written separately by UpdateProfile.
11
+ *
12
+ * `allowProfileCreation` stays true so ingesting an object with a new
13
+ * `cognitoSub` creates the profile, and re-ingesting an existing one resolves
14
+ * to it in place. (Customer Profiles requires the ingested object to carry the
15
+ * object type's UNIQUE key — the reason guest profiles need their own type.)
16
+ */
17
+ export declare const AMPLIFY_PROFILE_FIELDS: FieldMap[];
18
+ export declare const AMPLIFY_PROFILE_KEYS: KeyMap[];
19
+ /**
20
+ * AmplifyGuestProfile — the GUEST person profile object type.
21
+ *
22
+ * A distinct object type is required: Customer Profiles allows EXACTLY ONE
23
+ * `UNIQUE` key per object type and `PutProfileObject` rejects an object that
24
+ * does not carry that UNIQUE key. The authed `AmplifyProfile` reserves its
25
+ * UNIQUE key for `cognitoSub`, so guest profiles get their own type whose
26
+ * single UNIQUE key is `cognitoIdentityKey`, sourced from the Identity Pool
27
+ * `cognitoIdentityId` (e.g. `us-east-1:<uuid>`).
28
+ *
29
+ * Guest profiles are created in the SAME domain, so a SearchProfiles by
30
+ * `cognitoIdentityKey` and a later MergeProfiles into the authed profile work
31
+ * uniformly. On sign-in the guest profile is folded into the authed
32
+ * (sub-keyed) profile via MergeProfiles (see merge_resolver).
33
+ */
34
+ export declare const AMPLIFY_GUEST_PROFILE_FIELDS: FieldMap[];
35
+ export declare const AMPLIFY_GUEST_PROFILE_KEYS: KeyMap[];
36
+ /**
37
+ * AmplifyDevice — one object per stable device.
38
+ *
39
+ * UNIQUE object key = `deviceId` (stable), so a push-token refresh for the same
40
+ * device upserts the same object in place. The full ingested object carries the
41
+ * device schema: `deviceToken` (mutable push token), `channelType`, `platform`,
42
+ * `appVersion`, `createdAt` (immutable first-registration time, preserved
43
+ * across writes by the handler) and `updatedAt` (server-set on every write).
44
+ * Those non-key fields are NOT mapped to a target: Customer Profiles stores the
45
+ * ingested object verbatim and returns it from ListProfileObjects, so they
46
+ * survive refreshes without a field mapping. Only the key fields need targets,
47
+ * and CP requires targets under a reserved namespace (there is no `_object.*`
48
+ * namespace), so the keys map into `_profile.Attributes.*`.
49
+ *
50
+ * TWO profile-resolution keys (both PROFILE, not UNIQUE) let a device merge into
51
+ * EITHER the authed profile (via `cognitoUserKey` from `cognitoSub`) or the
52
+ * GUEST profile (via `cognitoIdentityKey` from `cognitoIdentityId`), depending
53
+ * on which identity field the ingested object carries. The object always
54
+ * carries the UNIQUE `deviceId`, so ingestion is valid for both.
55
+ */
56
+ export declare const AMPLIFY_DEVICE_FIELDS: FieldMap[];
57
+ export declare const AMPLIFY_DEVICE_KEYS: KeyMap[];
58
+ export declare const OBJECT_TYPE_NAMES: {
59
+ profile: string;
60
+ guestProfile: string;
61
+ device: string;
62
+ };
63
+ //# sourceMappingURL=object_types.d.ts.map
@@ -0,0 +1,131 @@
1
+ import { COGNITO_IDENTITY_FIELD, COGNITO_IDENTITY_KEY, COGNITO_USER_KEY, OBJECT_TYPE_DEVICE, OBJECT_TYPE_GUEST_PROFILE, OBJECT_TYPE_PROFILE, } from './constants.js';
2
+ const field = (name, source, target) => ({
3
+ name,
4
+ objectTypeField: {
5
+ contentType: 'STRING',
6
+ source: `_source.${source}`,
7
+ target,
8
+ },
9
+ });
10
+ /**
11
+ * AmplifyProfile — the AUTHENTICATED person profile object type.
12
+ *
13
+ * Single searchable identity key `cognitoUserKey` (PROFILE + UNIQUE) sourced
14
+ * from `cognitoSub`. The Lambda ingests a minimal `{cognitoSub}` object via
15
+ * PutProfileObject purely for the atomic find-or-create by that UNIQUE key;
16
+ * person / targeting attributes are written separately by UpdateProfile.
17
+ *
18
+ * `allowProfileCreation` stays true so ingesting an object with a new
19
+ * `cognitoSub` creates the profile, and re-ingesting an existing one resolves
20
+ * to it in place. (Customer Profiles requires the ingested object to carry the
21
+ * object type's UNIQUE key — the reason guest profiles need their own type.)
22
+ */
23
+ export const AMPLIFY_PROFILE_FIELDS = [
24
+ field('cognitoSub', 'cognitoSub', '_profile.Attributes.cognitoSub'),
25
+ ];
26
+ export const AMPLIFY_PROFILE_KEYS = [
27
+ {
28
+ // Searchable AUTHENTICATED identity key: SearchProfiles(cognitoUserKey,...).
29
+ name: COGNITO_USER_KEY,
30
+ objectTypeKeyList: [
31
+ {
32
+ standardIdentifiers: ['PROFILE', 'UNIQUE'],
33
+ fieldNames: ['cognitoSub'],
34
+ },
35
+ ],
36
+ },
37
+ ];
38
+ /**
39
+ * AmplifyGuestProfile — the GUEST person profile object type.
40
+ *
41
+ * A distinct object type is required: Customer Profiles allows EXACTLY ONE
42
+ * `UNIQUE` key per object type and `PutProfileObject` rejects an object that
43
+ * does not carry that UNIQUE key. The authed `AmplifyProfile` reserves its
44
+ * UNIQUE key for `cognitoSub`, so guest profiles get their own type whose
45
+ * single UNIQUE key is `cognitoIdentityKey`, sourced from the Identity Pool
46
+ * `cognitoIdentityId` (e.g. `us-east-1:<uuid>`).
47
+ *
48
+ * Guest profiles are created in the SAME domain, so a SearchProfiles by
49
+ * `cognitoIdentityKey` and a later MergeProfiles into the authed profile work
50
+ * uniformly. On sign-in the guest profile is folded into the authed
51
+ * (sub-keyed) profile via MergeProfiles (see merge_resolver).
52
+ */
53
+ export const AMPLIFY_GUEST_PROFILE_FIELDS = [
54
+ field(COGNITO_IDENTITY_FIELD, COGNITO_IDENTITY_FIELD, '_profile.Attributes.cognitoIdentityId'),
55
+ ];
56
+ export const AMPLIFY_GUEST_PROFILE_KEYS = [
57
+ {
58
+ // Searchable GUEST identity key: SearchProfiles(cognitoIdentityKey,...).
59
+ // The single UNIQUE key on the guest object type.
60
+ name: COGNITO_IDENTITY_KEY,
61
+ objectTypeKeyList: [
62
+ {
63
+ standardIdentifiers: ['PROFILE', 'UNIQUE'],
64
+ fieldNames: [COGNITO_IDENTITY_FIELD],
65
+ },
66
+ ],
67
+ },
68
+ ];
69
+ /**
70
+ * AmplifyDevice — one object per stable device.
71
+ *
72
+ * UNIQUE object key = `deviceId` (stable), so a push-token refresh for the same
73
+ * device upserts the same object in place. The full ingested object carries the
74
+ * device schema: `deviceToken` (mutable push token), `channelType`, `platform`,
75
+ * `appVersion`, `createdAt` (immutable first-registration time, preserved
76
+ * across writes by the handler) and `updatedAt` (server-set on every write).
77
+ * Those non-key fields are NOT mapped to a target: Customer Profiles stores the
78
+ * ingested object verbatim and returns it from ListProfileObjects, so they
79
+ * survive refreshes without a field mapping. Only the key fields need targets,
80
+ * and CP requires targets under a reserved namespace (there is no `_object.*`
81
+ * namespace), so the keys map into `_profile.Attributes.*`.
82
+ *
83
+ * TWO profile-resolution keys (both PROFILE, not UNIQUE) let a device merge into
84
+ * EITHER the authed profile (via `cognitoUserKey` from `cognitoSub`) or the
85
+ * GUEST profile (via `cognitoIdentityKey` from `cognitoIdentityId`), depending
86
+ * on which identity field the ingested object carries. The object always
87
+ * carries the UNIQUE `deviceId`, so ingestion is valid for both.
88
+ */
89
+ export const AMPLIFY_DEVICE_FIELDS = [
90
+ field('cognitoSub', 'cognitoSub', '_profile.Attributes.cognitoSub'),
91
+ field(COGNITO_IDENTITY_FIELD, COGNITO_IDENTITY_FIELD, '_profile.Attributes.cognitoIdentityId'),
92
+ field('deviceId', 'deviceId', '_profile.Attributes.deviceId'),
93
+ ];
94
+ export const AMPLIFY_DEVICE_KEYS = [
95
+ {
96
+ // Profile-resolution key (authed): merges the device into the sub's profile.
97
+ name: COGNITO_USER_KEY,
98
+ objectTypeKeyList: [
99
+ {
100
+ standardIdentifiers: ['PROFILE'],
101
+ fieldNames: ['cognitoSub'],
102
+ },
103
+ ],
104
+ },
105
+ {
106
+ // Profile-resolution key (guest): merges the device into the guest profile.
107
+ name: COGNITO_IDENTITY_KEY,
108
+ objectTypeKeyList: [
109
+ {
110
+ standardIdentifiers: ['PROFILE'],
111
+ fieldNames: [COGNITO_IDENTITY_FIELD],
112
+ },
113
+ ],
114
+ },
115
+ {
116
+ // Stable unique object key: token refresh updates this object in place.
117
+ name: 'deviceId',
118
+ objectTypeKeyList: [
119
+ {
120
+ standardIdentifiers: ['UNIQUE'],
121
+ fieldNames: ['deviceId'],
122
+ },
123
+ ],
124
+ },
125
+ ];
126
+ export const OBJECT_TYPE_NAMES = {
127
+ profile: OBJECT_TYPE_PROFILE,
128
+ guestProfile: OBJECT_TYPE_GUEST_PROFILE,
129
+ device: OBJECT_TYPE_DEVICE,
130
+ };
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0X3R5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL29iamVjdF90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixtQkFBbUIsR0FDcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUt4QixNQUFNLEtBQUssR0FBRyxDQUFDLElBQVksRUFBRSxNQUFjLEVBQUUsTUFBYyxFQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLElBQUk7SUFDSixlQUFlLEVBQUU7UUFDZixXQUFXLEVBQUUsUUFBUTtRQUNyQixNQUFNLEVBQUUsV0FBVyxNQUFNLEVBQUU7UUFDM0IsTUFBTTtLQUNQO0NBQ0YsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQWU7SUFDaEQsS0FBSyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsZ0NBQWdDLENBQUM7Q0FDcEUsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFhO0lBQzVDO1FBQ0UsNkVBQTZFO1FBQzdFLElBQUksRUFBRSxnQkFBZ0I7UUFDdEIsaUJBQWlCLEVBQUU7WUFDakI7Z0JBQ0UsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDO2dCQUMxQyxVQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUM7YUFDM0I7U0FDRjtLQUNGO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWU7SUFDdEQsS0FBSyxDQUNILHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsdUNBQXVDLENBQ3hDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFhO0lBQ2xEO1FBQ0UseUVBQXlFO1FBQ3pFLGtEQUFrRDtRQUNsRCxJQUFJLEVBQUUsb0JBQW9CO1FBQzFCLGlCQUFpQixFQUFFO1lBQ2pCO2dCQUNFLG1CQUFtQixFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQztnQkFDMUMsVUFBVSxFQUFFLENBQUMsc0JBQXNCLENBQUM7YUFDckM7U0FDRjtLQUNGO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQWU7SUFDL0MsS0FBSyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsZ0NBQWdDLENBQUM7SUFDbkUsS0FBSyxDQUNILHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsdUNBQXVDLENBQ3hDO0lBQ0QsS0FBSyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsOEJBQThCLENBQUM7Q0FDOUQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFhO0lBQzNDO1FBQ0UsNkVBQTZFO1FBQzdFLElBQUksRUFBRSxnQkFBZ0I7UUFDdEIsaUJBQWlCLEVBQUU7WUFDakI7Z0JBQ0UsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ2hDLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQzthQUMzQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLDRFQUE0RTtRQUM1RSxJQUFJLEVBQUUsb0JBQW9CO1FBQzFCLGlCQUFpQixFQUFFO1lBQ2pCO2dCQUNFLG1CQUFtQixFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUNoQyxVQUFVLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQzthQUNyQztTQUNGO0tBQ0Y7SUFDRDtRQUNFLHdFQUF3RTtRQUN4RSxJQUFJLEVBQUUsVUFBVTtRQUNoQixpQkFBaUIsRUFBRTtZQUNqQjtnQkFDRSxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDL0IsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDO2FBQ3pCO1NBQ0Y7S0FDRjtDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixPQUFPLEVBQUUsbUJBQW1CO0lBQzVCLFlBQVksRUFBRSx5QkFBeUI7SUFDdkMsTUFBTSxFQUFFLGtCQUFrQjtDQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDZm5PYmplY3RUeXBlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWN1c3RvbWVycHJvZmlsZXMnO1xuaW1wb3J0IHtcbiAgQ09HTklUT19JREVOVElUWV9GSUVMRCxcbiAgQ09HTklUT19JREVOVElUWV9LRVksXG4gIENPR05JVE9fVVNFUl9LRVksXG4gIE9CSkVDVF9UWVBFX0RFVklDRSxcbiAgT0JKRUNUX1RZUEVfR1VFU1RfUFJPRklMRSxcbiAgT0JKRUNUX1RZUEVfUFJPRklMRSxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5leHBvcnQgdHlwZSBGaWVsZE1hcCA9IENmbk9iamVjdFR5cGUuRmllbGRNYXBQcm9wZXJ0eTtcbmV4cG9ydCB0eXBlIEtleU1hcCA9IENmbk9iamVjdFR5cGUuS2V5TWFwUHJvcGVydHk7XG5cbmNvbnN0IGZpZWxkID0gKG5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKTogRmllbGRNYXAgPT4gKHtcbiAgbmFtZSxcbiAgb2JqZWN0VHlwZUZpZWxkOiB7XG4gICAgY29udGVudFR5cGU6ICdTVFJJTkcnLFxuICAgIHNvdXJjZTogYF9zb3VyY2UuJHtzb3VyY2V9YCxcbiAgICB0YXJnZXQsXG4gIH0sXG59KTtcblxuLyoqXG4gKiBBbXBsaWZ5UHJvZmlsZSDigJQgdGhlIEFVVEhFTlRJQ0FURUQgcGVyc29uIHByb2ZpbGUgb2JqZWN0IHR5cGUuXG4gKlxuICogU2luZ2xlIHNlYXJjaGFibGUgaWRlbnRpdHkga2V5IGBjb2duaXRvVXNlcktleWAgKFBST0ZJTEUgKyBVTklRVUUpIHNvdXJjZWRcbiAqIGZyb20gYGNvZ25pdG9TdWJgLiBUaGUgTGFtYmRhIGluZ2VzdHMgYSBtaW5pbWFsIGB7Y29nbml0b1N1Yn1gIG9iamVjdCB2aWFcbiAqIFB1dFByb2ZpbGVPYmplY3QgcHVyZWx5IGZvciB0aGUgYXRvbWljIGZpbmQtb3ItY3JlYXRlIGJ5IHRoYXQgVU5JUVVFIGtleTtcbiAqIHBlcnNvbiAvIHRhcmdldGluZyBhdHRyaWJ1dGVzIGFyZSB3cml0dGVuIHNlcGFyYXRlbHkgYnkgVXBkYXRlUHJvZmlsZS5cbiAqXG4gKiBgYWxsb3dQcm9maWxlQ3JlYXRpb25gIHN0YXlzIHRydWUgc28gaW5nZXN0aW5nIGFuIG9iamVjdCB3aXRoIGEgbmV3XG4gKiBgY29nbml0b1N1YmAgY3JlYXRlcyB0aGUgcHJvZmlsZSwgYW5kIHJlLWluZ2VzdGluZyBhbiBleGlzdGluZyBvbmUgcmVzb2x2ZXNcbiAqIHRvIGl0IGluIHBsYWNlLiAoQ3VzdG9tZXIgUHJvZmlsZXMgcmVxdWlyZXMgdGhlIGluZ2VzdGVkIG9iamVjdCB0byBjYXJyeSB0aGVcbiAqIG9iamVjdCB0eXBlJ3MgVU5JUVVFIGtleSDigJQgdGhlIHJlYXNvbiBndWVzdCBwcm9maWxlcyBuZWVkIHRoZWlyIG93biB0eXBlLilcbiAqL1xuZXhwb3J0IGNvbnN0IEFNUExJRllfUFJPRklMRV9GSUVMRFM6IEZpZWxkTWFwW10gPSBbXG4gIGZpZWxkKCdjb2duaXRvU3ViJywgJ2NvZ25pdG9TdWInLCAnX3Byb2ZpbGUuQXR0cmlidXRlcy5jb2duaXRvU3ViJyksXG5dO1xuXG5leHBvcnQgY29uc3QgQU1QTElGWV9QUk9GSUxFX0tFWVM6IEtleU1hcFtdID0gW1xuICB7XG4gICAgLy8gU2VhcmNoYWJsZSBBVVRIRU5USUNBVEVEIGlkZW50aXR5IGtleTogU2VhcmNoUHJvZmlsZXMoY29nbml0b1VzZXJLZXksLi4uKS5cbiAgICBuYW1lOiBDT0dOSVRPX1VTRVJfS0VZLFxuICAgIG9iamVjdFR5cGVLZXlMaXN0OiBbXG4gICAgICB7XG4gICAgICAgIHN0YW5kYXJkSWRlbnRpZmllcnM6IFsnUFJPRklMRScsICdVTklRVUUnXSxcbiAgICAgICAgZmllbGROYW1lczogWydjb2duaXRvU3ViJ10sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG5dO1xuXG4vKipcbiAqIEFtcGxpZnlHdWVzdFByb2ZpbGUg4oCUIHRoZSBHVUVTVCBwZXJzb24gcHJvZmlsZSBvYmplY3QgdHlwZS5cbiAqXG4gKiBBIGRpc3RpbmN0IG9iamVjdCB0eXBlIGlzIHJlcXVpcmVkOiBDdXN0b21lciBQcm9maWxlcyBhbGxvd3MgRVhBQ1RMWSBPTkVcbiAqIGBVTklRVUVgIGtleSBwZXIgb2JqZWN0IHR5cGUgYW5kIGBQdXRQcm9maWxlT2JqZWN0YCByZWplY3RzIGFuIG9iamVjdCB0aGF0XG4gKiBkb2VzIG5vdCBjYXJyeSB0aGF0IFVOSVFVRSBrZXkuIFRoZSBhdXRoZWQgYEFtcGxpZnlQcm9maWxlYCByZXNlcnZlcyBpdHNcbiAqIFVOSVFVRSBrZXkgZm9yIGBjb2duaXRvU3ViYCwgc28gZ3Vlc3QgcHJvZmlsZXMgZ2V0IHRoZWlyIG93biB0eXBlIHdob3NlXG4gKiBzaW5nbGUgVU5JUVVFIGtleSBpcyBgY29nbml0b0lkZW50aXR5S2V5YCwgc291cmNlZCBmcm9tIHRoZSBJZGVudGl0eSBQb29sXG4gKiBgY29nbml0b0lkZW50aXR5SWRgIChlLmcuIGB1cy1lYXN0LTE6PHV1aWQ+YCkuXG4gKlxuICogR3Vlc3QgcHJvZmlsZXMgYXJlIGNyZWF0ZWQgaW4gdGhlIFNBTUUgZG9tYWluLCBzbyBhIFNlYXJjaFByb2ZpbGVzIGJ5XG4gKiBgY29nbml0b0lkZW50aXR5S2V5YCBhbmQgYSBsYXRlciBNZXJnZVByb2ZpbGVzIGludG8gdGhlIGF1dGhlZCBwcm9maWxlIHdvcmtcbiAqIHVuaWZvcm1seS4gT24gc2lnbi1pbiB0aGUgZ3Vlc3QgcHJvZmlsZSBpcyBmb2xkZWQgaW50byB0aGUgYXV0aGVkXG4gKiAoc3ViLWtleWVkKSBwcm9maWxlIHZpYSBNZXJnZVByb2ZpbGVzIChzZWUgbWVyZ2VfcmVzb2x2ZXIpLlxuICovXG5leHBvcnQgY29uc3QgQU1QTElGWV9HVUVTVF9QUk9GSUxFX0ZJRUxEUzogRmllbGRNYXBbXSA9IFtcbiAgZmllbGQoXG4gICAgQ09HTklUT19JREVOVElUWV9GSUVMRCxcbiAgICBDT0dOSVRPX0lERU5USVRZX0ZJRUxELFxuICAgICdfcHJvZmlsZS5BdHRyaWJ1dGVzLmNvZ25pdG9JZGVudGl0eUlkJyxcbiAgKSxcbl07XG5cbmV4cG9ydCBjb25zdCBBTVBMSUZZX0dVRVNUX1BST0ZJTEVfS0VZUzogS2V5TWFwW10gPSBbXG4gIHtcbiAgICAvLyBTZWFyY2hhYmxlIEdVRVNUIGlkZW50aXR5IGtleTogU2VhcmNoUHJvZmlsZXMoY29nbml0b0lkZW50aXR5S2V5LC4uLikuXG4gICAgLy8gVGhlIHNpbmdsZSBVTklRVUUga2V5IG9uIHRoZSBndWVzdCBvYmplY3QgdHlwZS5cbiAgICBuYW1lOiBDT0dOSVRPX0lERU5USVRZX0tFWSxcbiAgICBvYmplY3RUeXBlS2V5TGlzdDogW1xuICAgICAge1xuICAgICAgICBzdGFuZGFyZElkZW50aWZpZXJzOiBbJ1BST0ZJTEUnLCAnVU5JUVVFJ10sXG4gICAgICAgIGZpZWxkTmFtZXM6IFtDT0dOSVRPX0lERU5USVRZX0ZJRUxEXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbl07XG5cbi8qKlxuICogQW1wbGlmeURldmljZSDigJQgb25lIG9iamVjdCBwZXIgc3RhYmxlIGRldmljZS5cbiAqXG4gKiBVTklRVUUgb2JqZWN0IGtleSA9IGBkZXZpY2VJZGAgKHN0YWJsZSksIHNvIGEgcHVzaC10b2tlbiByZWZyZXNoIGZvciB0aGUgc2FtZVxuICogZGV2aWNlIHVwc2VydHMgdGhlIHNhbWUgb2JqZWN0IGluIHBsYWNlLiBUaGUgZnVsbCBpbmdlc3RlZCBvYmplY3QgY2FycmllcyB0aGVcbiAqIGRldmljZSBzY2hlbWE6IGBkZXZpY2VUb2tlbmAgKG11dGFibGUgcHVzaCB0b2tlbiksIGBjaGFubmVsVHlwZWAsIGBwbGF0Zm9ybWAsXG4gKiBgYXBwVmVyc2lvbmAsIGBjcmVhdGVkQXRgIChpbW11dGFibGUgZmlyc3QtcmVnaXN0cmF0aW9uIHRpbWUsIHByZXNlcnZlZFxuICogYWNyb3NzIHdyaXRlcyBieSB0aGUgaGFuZGxlcikgYW5kIGB1cGRhdGVkQXRgIChzZXJ2ZXItc2V0IG9uIGV2ZXJ5IHdyaXRlKS5cbiAqIFRob3NlIG5vbi1rZXkgZmllbGRzIGFyZSBOT1QgbWFwcGVkIHRvIGEgdGFyZ2V0OiBDdXN0b21lciBQcm9maWxlcyBzdG9yZXMgdGhlXG4gKiBpbmdlc3RlZCBvYmplY3QgdmVyYmF0aW0gYW5kIHJldHVybnMgaXQgZnJvbSBMaXN0UHJvZmlsZU9iamVjdHMsIHNvIHRoZXlcbiAqIHN1cnZpdmUgcmVmcmVzaGVzIHdpdGhvdXQgYSBmaWVsZCBtYXBwaW5nLiBPbmx5IHRoZSBrZXkgZmllbGRzIG5lZWQgdGFyZ2V0cyxcbiAqIGFuZCBDUCByZXF1aXJlcyB0YXJnZXRzIHVuZGVyIGEgcmVzZXJ2ZWQgbmFtZXNwYWNlICh0aGVyZSBpcyBubyBgX29iamVjdC4qYFxuICogbmFtZXNwYWNlKSwgc28gdGhlIGtleXMgbWFwIGludG8gYF9wcm9maWxlLkF0dHJpYnV0ZXMuKmAuXG4gKlxuICogVFdPIHByb2ZpbGUtcmVzb2x1dGlvbiBrZXlzIChib3RoIFBST0ZJTEUsIG5vdCBVTklRVUUpIGxldCBhIGRldmljZSBtZXJnZSBpbnRvXG4gKiBFSVRIRVIgdGhlIGF1dGhlZCBwcm9maWxlICh2aWEgYGNvZ25pdG9Vc2VyS2V5YCBmcm9tIGBjb2duaXRvU3ViYCkgb3IgdGhlXG4gKiBHVUVTVCBwcm9maWxlICh2aWEgYGNvZ25pdG9JZGVudGl0eUtleWAgZnJvbSBgY29nbml0b0lkZW50aXR5SWRgKSwgZGVwZW5kaW5nXG4gKiBvbiB3aGljaCBpZGVudGl0eSBmaWVsZCB0aGUgaW5nZXN0ZWQgb2JqZWN0IGNhcnJpZXMuIFRoZSBvYmplY3QgYWx3YXlzXG4gKiBjYXJyaWVzIHRoZSBVTklRVUUgYGRldmljZUlkYCwgc28gaW5nZXN0aW9uIGlzIHZhbGlkIGZvciBib3RoLlxuICovXG5leHBvcnQgY29uc3QgQU1QTElGWV9ERVZJQ0VfRklFTERTOiBGaWVsZE1hcFtdID0gW1xuICBmaWVsZCgnY29nbml0b1N1YicsICdjb2duaXRvU3ViJywgJ19wcm9maWxlLkF0dHJpYnV0ZXMuY29nbml0b1N1YicpLFxuICBmaWVsZChcbiAgICBDT0dOSVRPX0lERU5USVRZX0ZJRUxELFxuICAgIENPR05JVE9fSURFTlRJVFlfRklFTEQsXG4gICAgJ19wcm9maWxlLkF0dHJpYnV0ZXMuY29nbml0b0lkZW50aXR5SWQnLFxuICApLFxuICBmaWVsZCgnZGV2aWNlSWQnLCAnZGV2aWNlSWQnLCAnX3Byb2ZpbGUuQXR0cmlidXRlcy5kZXZpY2VJZCcpLFxuXTtcblxuZXhwb3J0IGNvbnN0IEFNUExJRllfREVWSUNFX0tFWVM6IEtleU1hcFtdID0gW1xuICB7XG4gICAgLy8gUHJvZmlsZS1yZXNvbHV0aW9uIGtleSAoYXV0aGVkKTogbWVyZ2VzIHRoZSBkZXZpY2UgaW50byB0aGUgc3ViJ3MgcHJvZmlsZS5cbiAgICBuYW1lOiBDT0dOSVRPX1VTRVJfS0VZLFxuICAgIG9iamVjdFR5cGVLZXlMaXN0OiBbXG4gICAgICB7XG4gICAgICAgIHN0YW5kYXJkSWRlbnRpZmllcnM6IFsnUFJPRklMRSddLFxuICAgICAgICBmaWVsZE5hbWVzOiBbJ2NvZ25pdG9TdWInXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIC8vIFByb2ZpbGUtcmVzb2x1dGlvbiBrZXkgKGd1ZXN0KTogbWVyZ2VzIHRoZSBkZXZpY2UgaW50byB0aGUgZ3Vlc3QgcHJvZmlsZS5cbiAgICBuYW1lOiBDT0dOSVRPX0lERU5USVRZX0tFWSxcbiAgICBvYmplY3RUeXBlS2V5TGlzdDogW1xuICAgICAge1xuICAgICAgICBzdGFuZGFyZElkZW50aWZpZXJzOiBbJ1BST0ZJTEUnXSxcbiAgICAgICAgZmllbGROYW1lczogW0NPR05JVE9fSURFTlRJVFlfRklFTERdLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgLy8gU3RhYmxlIHVuaXF1ZSBvYmplY3Qga2V5OiB0b2tlbiByZWZyZXNoIHVwZGF0ZXMgdGhpcyBvYmplY3QgaW4gcGxhY2UuXG4gICAgbmFtZTogJ2RldmljZUlkJyxcbiAgICBvYmplY3RUeXBlS2V5TGlzdDogW1xuICAgICAge1xuICAgICAgICBzdGFuZGFyZElkZW50aWZpZXJzOiBbJ1VOSVFVRSddLFxuICAgICAgICBmaWVsZE5hbWVzOiBbJ2RldmljZUlkJ10sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgT0JKRUNUX1RZUEVfTkFNRVMgPSB7XG4gIHByb2ZpbGU6IE9CSkVDVF9UWVBFX1BST0ZJTEUsXG4gIGd1ZXN0UHJvZmlsZTogT0JKRUNUX1RZUEVfR1VFU1RfUFJPRklMRSxcbiAgZGV2aWNlOiBPQkpFQ1RfVFlQRV9ERVZJQ0UsXG59O1xuIl19