Permalink
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
927 lines (864 sloc) 27.3 KB
AWSTemplateFormatVersion: 2010-09-09
Parameters:
00oooDirections:
Type: String
Default: Please read these directions
AllowedValues:
- Please read these directions
- I have read these directions
Description: >-
PLEASE READ THESE DIRECTIONS CAREFULLY.
Welcome! This CloudFormation template will create and configure an
entire Userify Enterprise cluster, including Redis Elasticache
cluster, S3 bucket, Elastic Load Balancer (which you can replace
with ALB/NLB later), and an Autoscaling group for Userify.
FREE TEN SERVER LICENSE INCLUDED. Please read the directions here
and at https://userify.com/docs/enterprise/cloudformation/ carefully
and contact support@userify.com if you have questions.
When the stack has completed, the URL of the new stack will be shown
under "Outputs". Don't forget to safely record your cluster password
and crypto seed. You will be able to configure your Userify Enterprise
cluster using an easy-to-use web-based dashboard.
01oooClusterAdminUsername:
Description: >-
Please provide a username that you will use to administer the
cluster servers. It must be lowercase. 'admin' is recommended.
Type: String
Default: admin
AllowedPattern: "^[a-z0-9]*$"
MinLength: 5
ConstraintDescription: Please use at least 5 lowercase characters.
02oooClusterAdminPassword:
Description: >-
Please provide a PASSWORD that you will use to administer the
cluster servers. It must be at least 8 characters,
but longer is strongly recommended.
Type: String
NoEcho: true
MinLength: 8
ConstraintDescription: Please use at least 8 characters of any sort.
03oooClusterEncryptionSeed:
Description: >-
DO NOT LOSE THIS.
Please provide either random data or a long passphrase.
RECORD THIS ENCRYPTION SEED somewhere safe as it cannot be recovered.
This will be used to client-side encrypt data in your Redis cluster
and S3 bucket. Minimum 16 characters.
Type: String
NoEcho: true
MinLength: 16
ConstraintDescription: Please use at least 16 characters of any sort.
05oooVPC:
Description: >-
Please select the VPC that you would like to deploy Userify Enterprise into.
Important: this stack is designed for both default VPC and custom VPC
accounts, but will not function correctly with classic non-VPC AWS accounts.
Please contact support@userify.com for a replacement CloudFormation template.
Type: 'AWS::EC2::VPC::Id'
ConstraintDescription: Please select a valid VPC.
10oooSubnets:
Description: >-
Please select the subnets within the VPC above that should be used
for the Elastic Load Balancer (ELB) to listen on. Generally these should be
public subnets.
Type: 'List<AWS::EC2::Subnet::Id>'
ConstraintDescription: Please select one or more valid subnets.
11oooELBType:
Description: >-
Please select if you would prefer an external (normal) ELB.
You can still manage external access with security groups. This is
not recommended except in production and when all managed nodes are
within a single VPC. Please contact support@userify.com with
questions.
Type: String
Default: internet-facing
AllowedValues:
- internet-facing
- internal
15oooClustInstanceType:
Description: >-
Userify cluster instance sizes. m3.medium or m4.large provide a very
balance of power for the unique Userify load, which is heavily biased
toward single core performance.
Type: String
Default: t2.small
AllowedValues:
- t2.nano
- t2.micro
- t2.small
- t2.medium
- t2.large
- m3.medium
- m3.large
- m3.xlarge
- m3.2xlarge
- m4.large
- m4.xlarge
- m4.2xlarge
- m4.4xlarge
- m4.10xlarge
- c3.large
- c3.xlarge
- c3.2xlarge
- c3.4xlarge
- c3.8xlarge
- c4.large
- c4.xlarge
- c4.2xlarge
- c4.4xlarge
- c4.8xlarge
ConstraintDescription: Please select be a valid EC2 instance type.
20oooClusterMinSize:
Description: >-
Please specify the minimum number of nodes that the Userify
Enterprise auto-scaling group can scale to. This integer refers to
the Userify cluster itself, not the managed nodes.
The default, will allow your cluster to be highly available.
Until you get TLS/SSL configured (see documentation), it's recommended
that this stays at one so that you don't have to accept multiple
self-signed certificates.
Type: Number
Default: 1
25oooClusterMaxSize:
Description: >-
Please specify the maximum number of nodes that the Userify
Enterprise auto-scaling group can scale to. This integer refers to
the Userify cluster itself, not the managed nodes.
Type: Number
Default: '6'
50oooS3BucketName:
Description: >-
Userify S3 Bucket Name for primary datastore. Like all S3 bucket names,
this must be unique among all AWS customers, so using the name of your
company in it is recommended. Files stored in this bucket are strongly
encrypted, so please record your crypto seed above. Only lowercase,
numbers, and hyphens allowed.
Type: String
AllowedPattern: "^[a-z0-9-]*$"
ConstraintDescription: only lowercase, numbers, and hyphens allowed.
60oooECInstanceType:
Description: >-
US-WEST-2, YOU DO NOT SUPPORT THE cache.m4 INSTANCES (THE DEFAULT). Please
change this setting.
Instance type for the Elasticache cluster used by Userify Enterprise.
The default, cache.m4.large, is recommended for up to 1,500 managed instances
and is the smallest that can be used in a Replication Group (recommended).
Typically, this resource is lightly used even with very fast poll times.
Small deployments (<200 instances) may be even fine with t2 class instances.
Cache.m3.medium are recommended for up to 1,000 managed instances.
US-East-2 and Canada, You do not support cache.m3 instances.
Additional information in a table here, http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheNodes.SupportedTypes.html
Type: String
Default: cache.m4.large
AllowedValues:
- cache.t2.micro
- cache.t2.small
- cache.t2.medium
- cache.m3.medium
- cache.m3.large
- cache.m3.xlarge
- cache.m3.2xlarge
- cache.m4.large
- cache.m4.xlarge
- cache.m4.2xlarge
- cache.m4.4xlarge
- cache.m4.10xlarge
- cache.r3.large
- cache.r3.xlarge
- cache.r3.2xlarge
- cache.r3.4xlarge
- cache.r3.8xlarge
ConstraintDescription: Please select a valid Cache Node type.
70oooSSHKeyName:
Description: >-
Name of an existing EC2 KeyPair to enable SSH access to the Userify cluster
itself if you need to log in and manage it. You can replace this with
the Userify shim in the LC's AMI afterward (even in the same cluster).
Type: 'AWS::EC2::KeyPair::KeyName'
ConstraintDescription: Please choose the name of an existing EC2 KeyPair.
80oooSSHLocation:
Description: The IP address range that can be used to SSH to the EC2 instances
Type: String
MinLength: '9'
MaxLength: '18'
Default: 0.0.0.0/0
AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
90oooADHost:
Description: >-
Optional Active Directory or LDAP host URL.
Recommended format is ldaps://your-active-directory-server.
If this is left blank (as the default), other AD/LDAP
settings are ignored. You should ensure AD/LDAP is configured
before logging in the first time. You can change this later.
Type: String
91oooADBaseDN:
Description: >-
Optional Active Directory or LDAP base DN. You can change this later.
Default: DC=corp,DC=example,DC=com
Type: String
92oooADUsernameTemplate:
Description: >-
Optional Active Directory or LDAP username template.
The uppercase string USERNAME will be replaced with
the user's login username (Linux username will be the
same.) On LDAP, something like uid=USERNAME,DC=corp,DC=example,DC=com
may be more correct than the example. You can change this later.
Default: CORP\USERNAME
Type: String
93oooADSearchFilter:
Description: >-
Optional Active Directory or LDAP user search filter.
The uppercase string USERNAME will be replaced with
the user's login username. You can change this later.
Recommended format for Active Directory is (sAMAccountName=USERNAME)
Default: (sAMAccountName=USERNAME)
Type: String
94oooADSyncUser:
Description: >-
Optional Active Directory or LDAP sync user.
This is a regular user that can view other user accounts, to verify
validity and ensure accounts deleted in AD/LDAP are also deleted in
Userify. Do not grant admin privileges to this AD/LDAP user account as
they are not needed. You can change this later.
Recommended format is simply the username itself.
Type: String
95oooADSyncUserPassword:
Description: >-
Password for the sync user. You can change this later.
Type: String
NoEcho: true
99100oooMailServer:
Description: >-
Optional but recommended Mail Server hostname. If not
sending through Amazon SES servers, appending port 587 is
highly recommended to prevent invisible mail dropping or
delays. You can change mail settings later.
Amazon SES example, email-smtp.us-east-1.amazonaws.com:587
Google example, smtp.gmail.com:587
Default: email-smtp.us-east-1.amazonaws.com:587
Type: String
99101oooMailUsername:
Description: >-
Optional but recommended email (SMTP) username.
For example, yourname@gmail.com,
userify@example.com or AKIAxxx (when using Amazon SES SMTP)
Type: String
99102oooMailPassword:
Description: >-
Optional but recommended email (SMTP) password to send email.
Type: String
99103oooMailFromAddress:
Description: >-
Optional but recommended email from address.
For example, userify@example.com
Type: String
99104oooMailSubjectWord:
Description: >-
Optional but recommended email (SMTP) email subject word.
Type: String
Default: Userify Enterprise
99110oooSelfSigned:
Description: >-
If you will be replacing the self-signed certificates with
signed certificates (contact support), change this to false.
Type: String
Default: true
AllowedValues:
- true
- false
Mappings:
AWSInstanceType2Arch:
t2.nano:
Arch: HVM64
t2.micro:
Arch: HVM64
t2.small:
Arch: HVM64
t2.medium:
Arch: HVM64
t2.large:
Arch: HVM64
m3.medium:
Arch: HVM64
m3.large:
Arch: HVM64
m3.xlarge:
Arch: HVM64
m3.2xlarge:
Arch: HVM64
m4.large:
Arch: HVM64
m4.xlarge:
Arch: HVM64
m4.2xlarge:
Arch: HVM64
m4.4xlarge:
Arch: HVM64
m4.10xlarge:
Arch: HVM64
c3.large:
Arch: HVM64
c3.xlarge:
Arch: HVM64
c3.2xlarge:
Arch: HVM64
c3.4xlarge:
Arch: HVM64
c3.8xlarge:
Arch: HVM64
c4.large:
Arch: HVM64
c4.xlarge:
Arch: HVM64
c4.2xlarge:
Arch: HVM64
c4.4xlarge:
Arch: HVM64
c4.8xlarge:
Arch: HVM64
AWSRegionArch2AMI:
ap-south-1:
HVM64: ami-bc0d40d3
us-east-1:
HVM64: ami-da05a4a0
ap-northeast-1:
HVM64: ami-15872773
eu-west-1:
HVM64: ami-add175d4
ap-southeast-1:
HVM64: ami-67a6e604
ca-central-1:
HVM64: ami-8a71c9ee
us-west-1:
HVM64: ami-1c1d217c
eu-central-1:
HVM64: ami-97e953f8
sa-east-1:
HVM64: ami-466b132a
ap-southeast-2:
HVM64: ami-41c12e23
eu-west-2:
HVM64: ami-ecbea388
ap-northeast-2:
HVM64: ami-7b1cb915
us-west-2:
HVM64: ami-0a00ce72
us-east-2:
HVM64: ami-336b4456
Region2Principal:
us-east-1:
EC2Principal: ec2.amazonaws.com
us-west-2:
EC2Principal: ec2.amazonaws.com
us-west-1:
EC2Principal: ec2.amazonaws.com
eu-west-1:
EC2Principal: ec2.amazonaws.com
eu-west-2:
EC2Principal: ec2.amazonaws.com
ap-southeast-1:
EC2Principal: ec2.amazonaws.com
ap-northeast-1:
EC2Principal: ec2.amazonaws.com
ap-northeast-2:
EC2Principal: ec2.amazonaws.com
ap-southeast-2:
EC2Principal: ec2.amazonaws.com
ap-south-1:
EC2Principal: ec2.amazonaws.com
us-east-2:
EC2Principal: ec2.amazonaws.com
ca-central-1:
EC2Principal: ec2.amazonaws.com
sa-east-1:
EC2Principal: ec2.amazonaws.com
cn-north-1:
EC2Principal: ec2.amazonaws.com.cn
eu-central-1:
EC2Principal: ec2.amazonaws.com
S3RegionMap:
us-east-2:
S3Region: s3.us-east-2.amazonaws.com
us-east-1:
S3Region: s3.amazonaws.com
us-west-1:
S3Region: s3.us-west-1.amazonaws.com
us-west-2:
S3Region: s3.us-west-2.amazonaws.com
ca-central-1:
S3Region: s3.ca-central-1.amazonaws.com
ap-south-1:
S3Region: s3.ap-south-1.amazonaws.com
ap-northeast-2:
S3Region: s3.ap-northeast-2.amazonaws.com
ap-southeast-1:
S3Region: s3.ap-southeast-1.amazonaws.com
ap-southeast-2:
S3Region: s3.ap-southeast-2.amazonaws.com
ap-northeast-1:
S3Region: s3.ap-northeast-1.amazonaws.com
eu-central-1:
S3Region: s3-eu-central-1.amazonaws.com
eu-west-1:
S3Region: s3-eu-west-1.amazonaws.com
eu-west-2:
S3Region: s3-eu-west-2.amazonaws.com
sa-east-1:
S3Region: s3-sa-east-1.amazonaws.com
Resources:
RedisCluster:
Type: 'AWS::ElastiCache::CacheCluster'
Properties:
CacheNodeType: !Ref 60oooECInstanceType
Engine: redis
NumCacheNodes: 1
CacheSubnetGroupName: !Ref RedisClusterSubnets
VpcSecurityGroupIds:
- !GetAtt RedisClusterSecurityGroup.GroupId
Metadata:
'AWS::CloudFormation::Designer':
id: 76839c28-65f0-4771-8f66-28fce242c5de
RedisClusterSubnets:
Type: "AWS::ElastiCache::SubnetGroup"
Properties:
Description: "Subnets for ElastiCache"
SubnetIds: !Ref 10oooSubnets
Metadata:
'AWS::CloudFormation::Designer':
id: ab96b23f-91ea-4091-8d98-bf3e6f4d18c9
RedisClusterSecurityGroup:
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupDescription: Enable Redis access from VPC only
VpcId: !Ref 05oooVPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 6379
ToPort: 6379
CidrIp: 0.0.0.0/0
Metadata:
'AWS::CloudFormation::Designer':
id: b3d9a6c0-c24e-4484-b465-9fb0b40b3ddc
UserifyServerSecurityGroup:
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupDescription: Enable HTTP, HTTPS, and limited SSH access to Userify cluster
VpcId: !Ref 05oooVPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '22'
ToPort: '22'
CidrIp: !Ref 80oooSSHLocation
- IpProtocol: tcp
FromPort: '80'
ToPort: '80'
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: '443'
ToPort: '443'
CidrIp: 0.0.0.0/0
Metadata:
'AWS::CloudFormation::Designer':
id: b4b199d9-f6f4-4bde-a17e-69532308012e
UserifyServerInstance:
Type: 'AWS::AutoScaling::LaunchConfiguration'
Properties:
ImageId: !FindInMap
- AWSRegionArch2AMI
- !Ref 'AWS::Region'
- !FindInMap
- AWSInstanceType2Arch
- !Ref 15oooClustInstanceType
- Arch
InstanceType: !Ref 15oooClustInstanceType
SecurityGroups:
- !Ref UserifyServerSecurityGroup
KeyName: !Ref 70oooSSHKeyName
IamInstanceProfile: !Ref UserifyServerInstanceProfile
UserData:
Fn::Base64:
!Sub
- |
#!/bin/bash -xe
touch /etc/userify-defaults.cfg
chmod 600 /etc/userify-defaults.cfg
cat << EOF >> /etc/userify-defaults.cfg
# Userify Defaults
# These values are loaded from the cloudformation
# template that was used to generate this cluster.
# Additional documention here:
# https://userify.com/docs/enterprise/cloudformation/
# Please contact support@userify.com with questions.
CLUSTER_ADMIN_USERNAME="${01oooClusterAdminUsername}"
CLUSTER_ADMIN_PASSWORD="${02oooClusterAdminPassword}"
CRYPTOSEED="${03oooClusterEncryptionSeed}"
S3_BUCKET="${50oooS3BucketName}"
S3_REGION="${AWS::Region}"
S3_ENDPOINT="${LocalFindInMapS3Region}"
# REDIS settings:
REDIS_HOST="${RedisCluster.RedisEndpoint.Address}"
REDIS_PORT="${RedisCluster.RedisEndpoint.Port}"
REGION="${AWS::Region}"
ELB_NAME="${UserifyELB.DNSName}"
# optional AD/LDAP settings from the template:
LDAP_HOST="${90oooADHost}"
LDAP_REALM="${91oooADBaseDN}"
LDAP_SEARCH_FILTER="${93oooADSearchFilter}"
LDAP_USERNAME_TEMPLATE="${92oooADUsernameTemplate}"
LDAP_EMAIL="${94oooADSyncUser}"
LDAP_PASSWORD="${95oooADSyncUserPassword}"
# optional Email settings from the template:
MAIL_SERVER="${99100oooMailServer}"
MAIL_USERNAME="${99101oooMailUsername}"
MAIL_PASSWORD="${99102oooMailPassword}"
MAIL_FROM_ADDR="${99103oooMailFromAddress}"
MAIL_SUBJECT_WORD="${99104oooMailSubjectWord}"
# TLS self signed
SELF_SIGNED="${99110oooSelfSigned}"
EOF
curl -# "https://releases.userify.com/userify-ubuntu-virtenv.tar.gz" | tar -zxC /
sudo /opt/userify-server/pre_configure_ubuntu.sh 2>&1 |sudo tee /var/log/userify-server-initial.log &
-
LocalFindInMapS3Region: !FindInMap [S3RegionMap, !Ref 'AWS::Region', S3Region]
CreationPolicy:
ResourceSignal:
Timeout: PT15M
DependsOn:
- RedisCluster
- UserifyServerInstanceProfile
Metadata:
'AWS::CloudFormation::Designer':
id: 724275f4-a63e-4bba-b5f4-5ce4e7445304
UserifyServerRole:
Type: 'AWS::IAM::Role'
Properties:
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service:
- !FindInMap
- Region2Principal
- !Ref 'AWS::Region'
- EC2Principal
Action:
- 'sts:AssumeRole'
Path: /
Metadata:
'AWS::CloudFormation::Designer':
id: ade3c46c-f2cf-4750-8ac0-a15f7fac6bcb
UserifyServerRolePolicy:
Type: 'AWS::IAM::Policy'
Properties:
PolicyName: UserifyServerRole
PolicyDocument:
Statement:
- Effect: Allow
Action: elasticache:DescribeCacheClusters
Resource: '*'
- Sid: AllowRootLevelListingForUserify
Action: s3:ListBucket
Effect: Allow
Resource: !Sub arn:aws:s3:::${50oooS3BucketName}
- Sid: AllowUserToReadWriteForUserify
Action:
- s3:HeadObject
- s3:GetObject
- s3:PutObject
- s3:DeleteObject
Effect: Allow
Resource: !Sub arn:aws:s3:::${50oooS3BucketName}/*
Roles:
- !Ref UserifyServerRole
Metadata:
'AWS::CloudFormation::Designer':
id: 32acfbd7-c1c7-49f0-8581-7e15dc12a6c7
UserifyServerInstanceProfile:
Type: 'AWS::IAM::InstanceProfile'
Properties:
Path: /
Roles:
- !Ref UserifyServerRole
DependsOn:
- UserifyS3Bucket
Metadata:
'AWS::CloudFormation::Designer':
id: 3df85a97-67f8-44e8-9462-31d7c97dcce3
UserifyELB:
Type: 'AWS::ElasticLoadBalancing::LoadBalancer'
Properties:
CrossZone: true
LoadBalancerName: !Sub ${AWS::StackName}
HealthCheck:
Target: TCP:443
Timeout: 10
Interval: 30
UnhealthyThreshold: 10
HealthyThreshold: 10
SecurityGroups:
- !Ref UserifyServerSecurityGroup
Listeners:
- InstancePort: 80
LoadBalancerPort: 80
InstanceProtocol: HTTP
Protocol: HTTP
- InstancePort: 443
LoadBalancerPort: 443
InstanceProtocol: TCP
Protocol: TCP
Scheme: !Ref 11oooELBType
Subnets: !Ref 10oooSubnets
Metadata:
'AWS::CloudFormation::Designer':
id: 95c6013c-2b88-427f-94ba-a4c62a6bef3c
UserifyS3Bucket:
Type: 'AWS::S3::Bucket'
Properties:
BucketName: !Ref 50oooS3BucketName
Metadata:
'AWS::CloudFormation::Designer':
id: 02572f7a-c491-4828-9631-146542ea6fa3
UserifyASG:
Type: 'AWS::AutoScaling::AutoScalingGroup'
Properties:
VPCZoneIdentifier: !Ref 10oooSubnets
DesiredCapacity: !Ref 20oooClusterMinSize
HealthCheckType: ELB
HealthCheckGracePeriod: 190
MinSize: !Ref 20oooClusterMinSize
MaxSize: !Ref 25oooClusterMaxSize
LaunchConfigurationName: !Ref UserifyServerInstance
LoadBalancerNames: [!Ref UserifyELB]
Metadata:
'AWS::CloudFormation::Designer':
id: 05e02195-889c-4689-aca4-0612aa42d5dd
Outputs:
UserifyURL:
Description: "Now, create your first user!"
Value: !Sub 'https://${UserifyELB.DNSName}'
Metadata:
'AWS::CloudFormation::Designer':
b4b199d9-f6f4-4bde-a17e-69532308012e:
size:
width: 60
height: 60
position:
x: 30
'y': 160
z: 1
embeds: []
ade3c46c-f2cf-4750-8ac0-a15f7fac6bcb:
size:
width: 60
height: 60
position:
x: -180
'y': 270
z: 1
embeds: []
3df85a97-67f8-44e8-9462-31d7c97dcce3:
size:
width: 60
height: 60
position:
x: -80
'y': 270
z: 1
embeds: []
isassociatedwith:
- ade3c46c-f2cf-4750-8ac0-a15f7fac6bcb
dependson:
- 02572f7a-c491-4828-9631-146542ea6fa3
9d260ac7-0283-4953-b0c4-a3091c1ff294:
size:
width: 60
height: 60
position:
x: 200
'y': 280
z: 1
embeds: []
isassociatedwith:
- b4b199d9-f6f4-4bde-a17e-69532308012e
dependson:
- 02572f7a-c491-4828-9631-146542ea6fa3
- 76839c28-65f0-4771-8f66-28fce242c5de
- 3df85a97-67f8-44e8-9462-31d7c97dcce3
isrelatedto:
- 3df85a97-67f8-44e8-9462-31d7c97dcce3
32acfbd7-c1c7-49f0-8581-7e15dc12a6c7:
size:
width: 60
height: 60
position:
x: -280
'y': 270
z: 1
embeds: []
isassociatedwith:
- ade3c46c-f2cf-4750-8ac0-a15f7fac6bcb
5f81e7a1-0088-42b1-b39a-717104ea4ccc:
size:
width: 60
height: 60
position:
x: 320
'y': 180
z: 1
embeds: []
551ded72-afbd-4d83-a99c-1809e2a7a904:
source:
id: 5f81e7a1-0088-42b1-b39a-717104ea4ccc
target:
id: b4b199d9-f6f4-4bde-a17e-69532308012e
z: 1
76839c28-65f0-4771-8f66-28fce242c5de:
size:
width: 60
height: 60
position:
x: 30
'y': 390
z: 2
parent: ab96b23f-91ea-4091-8d98-bf3e6f4d18c9
embeds: []
isassociatedwith:
- 5f81e7a1-0088-42b1-b39a-717104ea4ccc
- b3d9a6c0-c24e-4484-b465-9fb0b40b3ddc
95c6013c-2b88-427f-94ba-a4c62a6bef3c:
size:
width: 60
height: 60
position:
x: 180
'y': 110
z: 1
embeds: []
isassociatedwith:
- 9d260ac7-0283-4953-b0c4-a3091c1ff294
- b4b199d9-f6f4-4bde-a17e-69532308012e
c364bcc2-3638-4ef1-bd50-ee4025434d97:
source:
id: 95c6013c-2b88-427f-94ba-a4c62a6bef3c
target:
id: 9d260ac7-0283-4953-b0c4-a3091c1ff294
z: 11
02572f7a-c491-4828-9631-146542ea6fa3:
size:
width: 60
height: 60
position:
x: -80
'y': 160
z: 1
embeds: []
dependson:
- f508f7b8-0523-417d-ad8d-314b91d68ee4
f508f7b8-0523-417d-ad8d-314b91d68ee4:
size:
width: 60
height: 60
position:
x: 40
'y': 60
z: 0
embeds: []
dependson:
- 02572f7a-c491-4828-9631-146542ea6fa3
ad531378-29c9-46dc-b2dc-ca0420979e94:
source:
id: 02572f7a-c491-4828-9631-146542ea6fa3
target:
id: f508f7b8-0523-417d-ad8d-314b91d68ee4
z: 12
7ba4a3c5-e1c0-4457-93a0-8ba9dfa0671c:
source:
id: 3df85a97-67f8-44e8-9462-31d7c97dcce3
target:
id: 02572f7a-c491-4828-9631-146542ea6fa3
z: 13
93367ccc-692b-46c7-8be3-e12003704462:
source:
id: 9d260ac7-0283-4953-b0c4-a3091c1ff294
target:
id: 02572f7a-c491-4828-9631-146542ea6fa3
z: 14
ee8b2a07-4f14-4c60-958b-93add29ae33c:
source:
id: 9d260ac7-0283-4953-b0c4-a3091c1ff294
target:
id: 76839c28-65f0-4771-8f66-28fce242c5de
z: 15
cff762ee-acdb-4fc7-b34e-4ee1cbc43dd9:
size:
width: 60
height: 60
position:
x: -240
'y': 390
z: 0
embeds: []
05e02195-889c-4689-aca4-0612aa42d5dd:
size:
width: 60
height: 60
position:
x: 180
'y': 210
z: 1
embeds: []
isassociatedwith:
- cff762ee-acdb-4fc7-b34e-4ee1cbc43dd9
- 95c6013c-2b88-427f-94ba-a4c62a6bef3c
- 9d260ac7-0283-4953-b0c4-a3091c1ff294
- 724275f4-a63e-4bba-b5f4-5ce4e7445304
10556726-c487-4a97-9672-59cda9180d27:
source:
id: 05e02195-889c-4689-aca4-0612aa42d5dd
target:
id: cff762ee-acdb-4fc7-b34e-4ee1cbc43dd9
z: 16
87cbee6d-1c05-4a50-9fed-8b21a4e0c1e4:
source:
id: 05e02195-889c-4689-aca4-0612aa42d5dd
target:
id: 95c6013c-2b88-427f-94ba-a4c62a6bef3c
z: 17
b3d9a6c0-c24e-4484-b465-9fb0b40b3ddc:
size:
width: 60
height: 60
position:
x: -70
'y': 390
z: 2
parent: ab96b23f-91ea-4091-8d98-bf3e6f4d18c9
embeds: []
ab96b23f-91ea-4091-8d98-bf3e6f4d18c9:
size:
width: 220
height: 120
position:
x: -100
'y': 360
z: 1
embeds:
- 76839c28-65f0-4771-8f66-28fce242c5de
- b3d9a6c0-c24e-4484-b465-9fb0b40b3ddc
724275f4-a63e-4bba-b5f4-5ce4e7445304:
size:
width: 60
height: 60
position:
x: 30
'y': 270
z: 1
embeds: []
isassociatedwith:
- b4b199d9-f6f4-4bde-a17e-69532308012e
dependson:
- 76839c28-65f0-4771-8f66-28fce242c5de
- 3df85a97-67f8-44e8-9462-31d7c97dcce3
isrelatedto:
- 3df85a97-67f8-44e8-9462-31d7c97dcce3