!LT)v{      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz Safe_  "&"!' #$&%(x)* +,-n.YX  WV/\~}y0Y12    3 4.-,5#$%]o678ml9! :NQ;<=>?@ABCDOPETUVFGHIJKLMRSWXZ[^_`prqcbadefghkjinmlpoqrutsxwv{zy~}| '()*+/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUZ[\]^_`abcdefghijkstuvwz{| "&"!' #$&%(x)* +,-n.YX  WV/\~}y0Y12    3 4.-,5#$%]o678ml9! :NQ;<=>?@ABCDOPETUVFGHIJKLMRSWXZ[^_`prqcbadefghkjinmlpoqrutsxwv{zy~}| '()*+/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUZ[\]^_`abcdefghijkstuvwz{|Safe_@kerryUser variableskerry+Template variables are special variables automatically set by Packer at build time. Some builders, provisioners and other components have template variables that are available only for that component. Template variables are recognizable because they're prefixed by a period, such as {{ .Name }}.kerry The name of the build being run.kerry-The type of the builder being used currently.kerryAReturns environment variables. See example in using home variablekerryZUTC time, which can be formatted. See more examples below in the isotime format reference.kerryLowercases the string.kerry-The working directory while executing Packer.kerry<Use a golang implementation of sed to parse an input string.kerryISplit an input string using separator and return the requested substring.kerry,The directory to the template for the build.kerry"The current Unix timestamp in UTC.kerryReturns a random UUID.kerryUppercases the string.kerryReturns Packer version.kerryImage names can only contain certain characters and have a maximum length, eg 63 on GCE & 80 on Azure. clean_resource_name will convert upper cases to lower cases and replace illegal characters with a "-" character.None_A  NoneX_H<kerryAmazon AMI BuilderCreate EBS-backed AMIs by launching a source AMI and re-packaging it into a new AMI after provisioning. If in doubt, use this builder, which is the easiest to get started with. 3https://www.packer.io/docs/builders/amazon-ebs.html 'amazon-ebs'kerryami_namekerry source_amikerry instance_typekerry.ami_description ami_groups ami_product_codeskerry ami_regionskerry"ami_users ami_virtualization_typekerryassociate_public_ip_addresskerryavailability_zone block_duration_minutes custom_endpoint_ec2 decode_authorization_messages disable_stop_instance ebs_optimized ena_support enable_t2_unlimited encrypt_boot kms_key_id force_delete_snapshot force_deregisterkerryiam_instance_profilekerryinsecure_skip_tls_verifykerryClaunch_block_device_mappings mfa_code profile region_kms_key_idskerry"run_tags run_volume_tags security_group_id security_group_ids security_group_filter shutdown_behavior skip_region_validation snapshot_groups snapshot_users snapshot_tags spot_price spot_price_auto_product spot_tags sriov_support ssh_keypair_name ssh_agent_auth ssh_interfacekerrysubnet_id subnet_filter - Ohttps://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.htmlkerryxtags temporary_key_pair_name temporary_security_group_source_cidrs token user_data user_data_file vault_aws_enginekerryvpc_id vpc_filter -  Lhttps://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html windows_password_timeoutkerry6The device name exposed to the instance (for example, devDsdh or xvdh). Required for every device in the block device mapping.kerryThe volume type. gp2 for General Purpose (SSD) volumes, io1 for Provisioned IOPS (SSD) volumes, and standard for Magnetic volumeskerry{The number of I/O operations per second (IOPS) that the volume supports. See the documentation on IOPs for more informationkerryHThe size of the volume, in GiB. Required if not specifying a snapshot_idkerryIndicates whether the EBS volume is deleted on instance termination. Default false. NOTE: If this value is not explicitly set to true and volumes are not cleaned up by an alternative method, additional volumes will accumulate after every build.kerryIndicates whether or not to encrypt the volume. By default, Packer will keep the encryption setting to what it was in the source image. Setting false will result in an unencrypted device, and true will result in an encrypted one.kerryKMS Key ID to use when  encrytped is set to True.kerryThe ID of the snapshotkerryOSuppresses the specified device included in the block device mapping of the AMIkerry[The virtual device name. See the documentation on Block Device Mapping for more informationkerry'The image architecture (i386 | x86_64).kerry`A Boolean value that indicates whether the Amazon EBS volume is deleted on instance termination.kerryDThe device name specified in the block device mapping (for example, devsdh or xvdh).rminationkerry/The ID of the snapshot used for the EBS volume.kerry*The volume size of the EBS volume, in GiB.kerryEThe volume type of the EBS volume (gp2 | io1 | st1 | sc1 | standard).kerry>A Boolean that indicates whether the EBS volume is encrypted.ekerryPThe description of the image (provided during image creation).-mapping.encryptedkerryIA Boolean that indicates whether enhanced networking with ENA is enabled.kerry The hypervisor type (ovm | xen).kerryThe ID of the image.rkerry,The image type (machine | kernel | ramdisk).kerry5A Boolean that indicates whether the image is public.kerryThe kernel ID.kerry#The location of the image manifest.kerryAThe name of the AMI (provided during image creation).est-locationkerryString value from an Amazon-maintained list (amazon | aws-marketplace | microsoft) of snapshot owners. Not to be confused with the user-configured AWS account alias, which is set from the IAM console.kerry(The AWS account ID of the image owner.askerry;The platform. To only list Windows-based AMIs, use windows.kerryThe product code.kerry4The type of the product code (devpay | marketplace).kerryThe RAM disk IDkerry8The device name of the root device volume (for example, devsda1).kerry:The type of the root device volume (ebs | instance-store).kerry@The state of the image (available | pending | failed).evice-typekerry%The reason code for the state change.kerry!The message for the state change.kerrydA value of simple indicates that enhanced networking with the Intel 82599 VF interface is enabled.gekerry.The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value. For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.supportkerryThe key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.>kerry,The virtualization type (paravirtual | hvm).kerryConstruct a basic kerryConstruct a basic  amazon-ebs builder.kerryEBS serializationPPNone_kerrykerry&The path to a local file or directory to upload to the machine. The path can be absolute or relative. If it is relative, it is relative to the working directory when Packer is executed. If this is a directory, the existence of a trailing slash is important. Read below on uploading directories.kerryThe path where the file will be uploaded to in the machine. This value must be a writable location and any parent directories must already exist. If the provisioning user (generally not root) cannot write to this directory, you will receive a "Permission Denied" error. If the source is a file, it's a good idea to make the destination a file as well, but if you set your destination as a directory, at least make sure that the destination ends in a trailing slash so that Packer knows to use the source's basename in the final upload path. Failure to do so may cause Packer to fail on file uploads. If the destination file already exists, it will be overwritten.kerryThe direction of the file transfer. This defaults to "upload". If it is set to "download" then the file "source" in the machine will be downloaded locally to "destination"kerryFor advanced users only. If true, check the file existence only before uploading, rather than upon pre-build validation. This allows to upload files created on-the-fly. This defaults to false. We don't recommend using this feature, since it can cause Packer to become dependent on system state. We would prefer you generate your files before the Packer run, but realize that there are situations where this may be unavoidable.  None_!kerry!%kerryThe shell Packer provisioner provisions machines built by Packer using shell scripts. Shell provisioning is the easiest way to get software installed and configured on a machine.(kerryIf true, specifies that the script(s) are binary files, and Packer should therefore not convert Windows line endings to Unix line endings (if there are any). By default this is false.)kerry;Valid exit codes for the script. By default this is just 0.*kerryAn array of key/value pairs to inject prior to the execute_command. The format should be key=value. Packer injects some environmental variables by default into the environment, as well, which are covered in the section below.+kerryIf true, Packer will write your environment variables to a tempfile and source them from that file, rather than declaring them inline in our execute_command. The default execute_command will be chmod +x {{.Path}}; . {{.EnvVarFile}} && {{.Path}}. This option is unnecessary for most cases, but if you have extra quoting in your custom execute_command, then this may be unnecessary for proper script execution. Default: false.,kerry_The command to use to execute the script. By default this is chmod +x {{ .Path }}; {{ .Vars }} {{ .Path }}, unless the user has set "use_env_var_file": true -- in that case, the default execute_command is chmod +x {{.Path}}; . {{.EnvVarFile}} && {{.Path}}. The value of this is treated as a configuration template. There are three available variables:Path is the path to the script to run Vars is the list of environment_vars, if configured. EnvVarFile is the path to the file containing env vars, if use_env_var_file is true.-kerryDefaults to false. Whether to error if the server disconnects us. A disconnect might happen if you restart the ssh server or reboot the host..kerryXThe shebang value to use when running commands specified by inline. By default, this is binsh -e. If you're not using inline, then this configuration has no effect. Important: If you customize this, be sure to include something like the -e flag, otherwise individual steps failing won't fail the provisioner./kerryRThe folder where the uploaded script will reside on the machine. This defaults to '/tmp'.0kerryLThe filename the uploaded script will have on the machine. This defaults to 'script_nnn.sh'.1kerryThe full path to the uploaded script will have on the machine. By default this is remote_folder/remote_file, if set this option will override both remote_folder and remote_file.2kerryIf true, specifies that the helper scripts uploaded to the system will not be removed by Packer. This defaults to false (clean scripts from the system).3kerryThe amount of time to attempt to start the remote process. By default this is 5m or 5 minutes. This setting exists in order to deal with times when SSH may restart, such as a system reboot. Set this to a higher value if reboots take a longer amount of time.4kerryuWait the amount of time after provisioning a shell script, this pause be taken if all previous steps were successful.5kerryBasic %6kerryShell serialization!"#$%&'()*+,-./0123456%&'()*+,-./012345!"#$6None_&i;kerryssh communicator :https://www.packer.io/docs/templates/communicator.html#ssh=kerry ssh_username> - The username to connect to SSH with. Required if using SSH.>kerryssh_ptyS - If true, a PTY will be requested for the SSH connection. This defaults to false.?kerry ssh_timeout (string) - The time to wait for SSH to become available. Packer uses this to determine when the machine has booted so this is usually quite long. Example value: 10. ssh_agent_auth{ (boolean) - If true, the local SSH agent will be used to authenticate connections to the remote host. Defaults to false. ssh_bastion_agent_authr (boolean) - If true, the local SSH agent will be used to authenticate with the bastion host. Defaults to false. ssh_bastion_hostB (string) - A bastion host to use for the actual SSH connection. ssh_bastion_passwordH (string) - The password to use to authenticate with the bastion host. ssh_bastion_port; (number) - The port of the bastion host. Defaults to 22. ssh_bastion_private_key_file (string) - Path to a PEM encoded private key file to use to authenticate with the bastion host. The ~ can be used in path and will be expanded to the home directory of current user. ssh_bastion_username: (string) - The username to connect to the bastion host. ssh_clear_authorized_keysL (boolean) - If true, Packer will attempt to remove its temporary key from ~.sshauthorized_keys and root.ssh/authorized_keys. This is a mostly cosmetic option, since Packer will delete the temporary private key from the host system regardless of whether this is set to true (unless the user has set the -debug flag). Defaults to "false"; currently only works on guests with sed installed. ssh_disable_agent_forwardingQ (boolean) - If true, SSH agent forwarding will be disabled. Defaults to false. ssh_file_transfer_method^ (scp or sftp) - How to transfer files, Secure copy (default) or SSH File Transfer Protocol. ssh_handshake_attemptsd (number) - The number of handshakes to attempt with SSH once it can connect. This defaults to 10. ssh_host] (string) - The address to SSH to. This usually is automatically configured by the builder. ssh_keep_alive_interval (string) - How often to send "keep alive" messages to the server. Set to a negative value (-1s) to disable. Example value: 10s. Defaults to 5s.  ssh_passwordC (string) - A plaintext password to use to authenticate with SSH. ssh_port> (number) - The port to connect to SSH. This defaults to 22. ssh_private_key_file (string) - Path to a PEM encoded private key file to use to authenticate with SSH. The ~ can be used in path and will be expanded to the home directory of current user. ssh_proxy_host: (string) - A SOCKS proxy host to use for SSH connection ssh_proxy_passwordR (string) - The password to use to authenticate with the proxy server. Optional. ssh_proxy_port: (number) - A port of the SOCKS proxy. Defaults to 1080. ssh_proxy_usernameK (string) - The username to authenticate with the proxy server. Optional. ssh_read_write_timeout (string) - The amount of time to wait for a remote command to end. This might be useful if, for example, packer hangs on a connection after a reboot. Example: 5m. Disabled by default.@kerry Communicator-See the following for more information: -  6https://www.packer.io/docs/templates/communicator.html - 2https://www.packer.io/docs/provisioners/index.htmlAkerrySNo communicator will be used. If this is set, most provisioners also can't be used.BkerryRAn SSH connection will be established to the machine. This is usually the default.Ckerry'A WinRM connection will be established.DkerryPackerKA concrete representation for configuring the various components of Packer.Lkerry Concrete LOkerry Provisioner-See the following for more information: -  6https://www.packer.io/docs/templates/provisioners.html - 2https://www.packer.io/docs/provisioners/index.htmlWkerry Concrete WYkerryBuilders,See the following for more information -  2https://www.packer.io/docs/templates/builders.html - .https://www.packer.io/docs/builders/index.html`kerryBasic OakerryA minimal default ssh communicator where only the username needs to be specifiedbkerry Render an D to ZckerryPacker serializationdkerryBuilder serializationekerryBuilderType serialization{kerryCommunicator serializationfkerryUserVariable serializationgkerryProvisioner serializationhkerryPostProcessor serialization.;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh.DEFGHI^_YZ[\]WXOPQRSTUV`LMNJK@ABC;<=>?abcdefghNone(#@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab#DEFGHIb^_YZ[\]WX@ABCaOPQRSTUV`LMNJK None_)m|}             ! " # $ %& %' ( ) * + , - . / 0 1 23 4 5 6 7 8 9 : ; < = %> ?@ A B C D E %F GH I ?J K LM N OP QR S T UV UW UX UY UZ [\ [] [^ [_`ab cd Ue f Ug Uh ij ik il im no Up cq cr Us nt nu Uv Uw Uxyz{ |} G~ %                       2 2 2 2 2 2 2 2 2 2 2 2 2 2 Q Q Q Q Q Q                       O O O O O O O O O O O O O O O O O O O O O O O O O                      n G G G  ? ? ? ? ? ? ? ? ? ? ? ? ? ?! ?" ?# ?$ ?% ?& ?' ?( ?) ?* ?+ ?, ?- ?. ?/ ?0 ?1 ?2 ?3 |4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M LN LO LP LQ LR LS LT LU V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p qr qs qt qu qv qw qx qy qz { | } ~                                  % % % % % % % % %      !"#$%&&'()*+,-./0123456789:;<=>?@ABBCDEFGHIJKLMNOPPQRSTUVWXYZ[\]^_`abcdeefghijklmmnopqrrstuvvwxyz{|}~  kerry-0.1-EwT2fBOzFYTFOKWCxEbuRKKerry.Internal.Prelude Kerry.EngineKerry.Internal.SerialKerry.Builder.AmazonEC2Kerry.Provisioner.FileKerry.Provisioner.Shell Kerry.PackerKerry Kerry.ExamplebaseGHC.Base++ghc-primGHC.PrimseqGHC.Listfilterzip System.IOprint Data.Tuplefstsnd otherwisemap$GHC.Num fromInteger-GHC.Real fromRationalGHC.EnumenumFrom enumFromThen enumFromToenumFromThenTo GHC.Classes==>=negatefail>>=>>fmapreturn fromIntegral realToFrac toInteger toRational Control.Monadguard<>memptymappendmconcatjoin<*>pure*>BoundedEnumEq GHC.FloatFloating FractionalIntegralMonadFunctorNumOrdGHC.ReadReadReal RealFloatRealFracGHC.ShowShow Applicative Data.FoldableFoldableData.Traversable Traversable SemigroupMonoid GHC.TypesBoolCharDoubleFloatIntGHC.IntInt8Int16Int32Int64 integer-gmpGHC.Integer.TypeInteger GHC.MaybeMaybeOrderingRationalIOWordGHC.WordWord8Word16Word32Word64 Data.EitherEitherFalseNothingJustTrueLeftRightLTEQGTbytestring-0.10.8.2Data.ByteString.Internal ByteString Data.Functor<$>readList text-1.2.3.1Data.Text.InternalTextcontainers-0.6.0.1Data.Map.InternalMapcompare<* Text.ReadreadString Alternativemplusmzero MonadPlus Data.VoidVoidData.Semigroupoption mtimesDefaultdiffcycle1getMinMingetMaxMaxArgArgMinArgMaxgetFirstFirstgetLastLast unwrapMonoid WrapMonoid WrappedMonoid getOptionOptionData.Bifunctorsecondfirstbimap BifunctorControl.Monad.IO.ClassliftIOMonadIOmfilter<$!>unless replicateM_ replicateMfoldM_foldM zipWithM_zipWithM mapAndUnzipMforever<=<>=>filterMforMforsequencemapM sequenceAtraverseControl.Applicativeoptional unwrapMonad WrapMonad WrappedMonad unwrapArrow WrapArrow WrappedArrow getZipListZipListreadIOreadLn appendFile writeFilereadFileinteract getContentsgetLinegetCharputStrLnputStrputCharGHC.IO.ExceptionioErrorGHC.IOFilePath userErrorIOErrorData.Functor.ConstgetConstConstnotElemallanyorand concatMapconcatmsum sequence_forM_mapM_for_ traverse_productsumminimummaximumelemlengthnullfoldl1foldr1foldlfoldrfoldMapData.Semigroup.Internal stimesMonoidstimesIdempotentgetDualDualappEndoEndogetAllAllgetAnyAnygetSumSum getProductProduct Data.OldListunwordswordsunlineslinesreadseitherlex readParen readsPrecText.ParserCombinators.ReadPReadSatanhacoshasinhtanhcoshsinhatanacosasintancossinlogBase**sqrtlogexppiatan2isIEEEisNegativeZeroisDenormalized isInfiniteisNaN scaleFloat significandexponent encodeFloat decodeFloat floatRange floatDigits floatRadixvoidlcmgcd^^^oddevendivModquotRemmoddivremquotrecip/floorceilingroundtruncateproperFractionmaxBoundminBoundfromEnumtoEnumpredsucc showParen showStringshowCharshowsShowSshowListshow showsPrecunzip3unzipzipWith3zipWithzip3!!lookupreversebreakspansplitAtdroptake dropWhile takeWhilecycle replicaterepeatiteratescanr1scanrscanl1scanlinitlasttailhead Data.MaybemapMaybe catMaybes listToMaybe maybeToList fromMaybefromJust isNothingisJustmaybeuncurrycurrysubtractsignumabs*+asTypeOfuntil$!flip.constidapliftM5liftM4liftM3liftM2liftMwhen=<<liftA3liftA<**>stimessconcat<$liftA2manysome<|>GHC.Err undefinederrorWithoutStackTraceerrorstimesIdempotentMonoidGHC.Exception.Type SomeException/=<=&&||not<>maxminData.Set.InternalSettransformers-0.5.5.0Control.Monad.Trans.Except runExceptTExceptT#mmorph-1.1.3-CrbW1pkoojp2congoTX0Y2Control.Monad.Morphhoist2transformers-bifunctors-0.1-DoSlvJIT7V94L0wy1RLxCPControl.Monad.Trans.BifunctorsecondXfirstXbimapXsecondTfirstTbimapTBifunctorTrans hoistEither hoistMaybe joinEithersyncIO RawTemplateTemplaterenderTemplate toTemplaterenderRawTemplateusertemplateVariable buildName buildTypeenvisotimelowerpwdsedsplit templateDir timestampuuidupper packerVersioncleanResourceName $fEqTemplate$fShowTemplate$fEqRawTemplate$fShowRawTemplate listToObjectlist.=?fromMap fromMapWitht asTextWithasByteStringWithprettyAsTextWithprettyAsByteStringWithEBS ebsAmiName ebsSourceAmiebsInstanceTypeebsAmiDescription ebsAmiRegions ebsAmiUsersebsAssociatePublicIpAddressebsAvailabilityZoneebsIAMInstanceProfileebsInsecureSkipTLSVerifyebsLaunchBlockDeviceMappings ebsRunTags ebsSubnetIdebsTagsebsVpcIdBlockDeviceMappingblockDeviceMappingNameblockDeviceMappingVolumeTypeblockDeviceMappingIOPSblockDeviceMappingVolumeSize%blockDeviceMappingDeleteOnTerminationblockDeviceMappingEncryptedblockDeviceMappingKMSblockDeviceMappingSnapshotIdblockDeviceMappingVirtualNameblockDeviceMappingNoDeviceSourceAmiFilterKey Architecture%BlockDeviceMappingDeleteOnTerminationBlockDeviceMappingDeviceNameBlockDeviceMappingSnapshotIdBlockDeviceMappingVolumeSizeBlockDeviceMappingVolumeType BlockDevice Description EnaSupport HypervisorImageId ImageTypeIsPublicKernelIdManifestLocationName OwnerAliasOwnerIdPlatform ProductCodeProductCodeType RamdiskIdRootDeviceNameRootDeviceTypeStateStateReasonCodeStateReasonMessageSriovNetSupportTagTagKeyVirtualizationType AWSAmiOwnerAccountsSelfAlias SourceAmi SourceAmiIdSourceAmiFilterAWS awsRegionawsCredentials awsBuilder Credentials AWSProfileEnvironmentVariablesfromAWSblockDeviceMappingebsfromEBS$fEqCredentials$fShowCredentials$fEqAWS $fShowAWS$fEqAWSAmiOwner$fShowAWSAmiOwner$fEqSourceAmiFilterKey$fShowSourceAmiFilterKey $fEqSourceAmi$fShowSourceAmi$fEqBlockDeviceMapping$fShowBlockDeviceMapping$fEqEBS $fShowEBS FileDirection FileUpload FileDownloadFile fileSourcefileDestination fileDirection fileGeneratedfromFile$fEqFileDirection$fShowFileDirection$fEqFile $fShowFile ShellTypeInlineScriptScriptsShell shellType shellBinaryshellValidExitCodesshellEnvironmentVarsshellUseEnvVarFileshellExecuteCommandshellExpectDisconnectshellInlineShebangshellRemoteFoldershellRemoteFileshellRemotePathshellSkipCleanshellStartRetryTimeoutshellPauseAftershell fromShell $fEqShellType$fShowShellType $fEqShell $fShowShellSSHCommunicator sshUsernamesshPty sshTimeout CommunicatorNoneSSHWinRmPacker variablesbuilders provisionerspostProcessors PostProcessorProvisionerTypeShellProvisionerFileProvisioner ProvisionerprovisionerTypeprovisionerOnlyprovisionerExceptprovisionerPauseBeforeprovisionerTimeoutprovisionerOverride BuilderTypeAmazonEBSBuilderBuilder builderType builderNamebuilderCommunicator UserVariable provisionerdefaultSSHCommunicator renderPacker fromPacker fromBuilderfromBuilderTypefromUserVariablefromProvisionerfromPostProcessor$fEqUserVariable$fShowUserVariable$fEqBuilderType$fShowBuilderType$fEqProvisionerType$fShowProvisionerType$fEqProvisioner$fShowProvisioner$fEqPostProcessor$fShowPostProcessor$fEqSSHCommunicator$fShowSSHCommunicator$fEqCommunicator$fShowCommunicator $fEqBuilder $fShowBuilder $fEqPacker $fShowPackerfromCommunicatorexample