You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@openwhisk.apache.org by GitBox <gi...@apache.org> on 2018/03/27 20:34:36 UTC

[GitHub] mrutkows closed pull request #816: Multiple Project Management, adding sync command, and undeploy just using Project Name

mrutkows closed pull request #816: Multiple Project Management, adding sync command, and undeploy just using Project Name  
URL: https://github.com/apache/incubator-openwhisk-wskdeploy/pull/816
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json
index a7ba4c55..80631ab5 100644
--- a/Godeps/Godeps.json
+++ b/Godeps/Godeps.json
@@ -105,11 +105,11 @@
 		},
 		{
 			"ImportPath": "github.com/apache/incubator-openwhisk-client-go/whisk",
-			"Rev": "717bc3a1638460e069e411e9a8bf0ea5c97f1efa"
+			"Rev": "1759868a61729708a8ab1a6de1b409d6e2aea00a"
 		},
 		{
 			"ImportPath": "github.com/apache/incubator-openwhisk-client-go/wski18n",
-			"Rev": "717bc3a1638460e069e411e9a8bf0ea5c97f1efa"
+			"Rev": "1759868a61729708a8ab1a6de1b409d6e2aea00a"
 		},
 		{
 			"ImportPath": "github.com/pelletier/go-buffruneio",
diff --git a/cmd/root.go b/cmd/root.go
index 0f936747..77b2e031 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -239,6 +239,34 @@ func Undeploy() error {
 	whisk.SetVerbose(utils.Flags.Verbose)
 	whisk.SetDebug(utils.Flags.Trace)
 
+	if len(utils.Flags.ProjectName) != 0 {
+		var deployer = deployers.NewServiceDeployer()
+		deployer.Preview = utils.Flags.Preview
+
+		clientConfig, error := deployers.NewWhiskConfig(utils.Flags.CfgFile, "", "")
+		if error != nil {
+			return error
+		}
+
+		whiskClient, error := deployers.CreateNewClient(clientConfig)
+		if error != nil {
+			return error
+		}
+
+		deployer.Client = whiskClient
+		deployer.ClientConfig = clientConfig
+
+		// The auth, apihost and namespace have been chosen, so that we can check the supported runtimes here.
+		setSupportedRuntimes(clientConfig.Host)
+
+		err := deployer.UnDeployProject()
+		if err != nil {
+			return err
+		}
+
+		return nil
+	}
+
 	project_Path := strings.TrimSpace(utils.Flags.ProjectPath)
 	if len(project_Path) == 0 {
 		project_Path = utils.DEFAULT_PROJECT_PATH
@@ -294,7 +322,6 @@ func Undeploy() error {
 		} else {
 			return nil
 		}
-
 	} else {
 		errString := wski18n.T(wski18n.ID_ERR_MANIFEST_FILE_NOT_FOUND_X_path_X,
 			map[string]interface{}{wski18n.KEY_PATH: utils.Flags.ManifestPath})
diff --git a/cmd/sync.go b/cmd/sync.go
new file mode 100644
index 00000000..4e1279c5
--- /dev/null
+++ b/cmd/sync.go
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cmd
+
+import (
+	"github.com/apache/incubator-openwhisk-wskdeploy/utils"
+	"github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
+	"github.com/spf13/cobra"
+)
+
+// sync represents the mechanism to sync OpenWhisk projects between client and server
+var syncCmd = &cobra.Command{
+	Use:        "sync",
+	SuggestFor: []string{"update"},
+	Short:      wski18n.T(wski18n.ID_CMD_DESC_SHORT_SYNC),
+	Long:       wski18n.T(wski18n.ID_CMD_DESC_LONG_SYNC),
+	RunE:       SyncCmdImp,
+}
+
+func SyncCmdImp(cmd *cobra.Command, args []string) error {
+	utils.Flags.Sync = true
+	return Deploy()
+}
+
+func init() {
+	RootCmd.AddCommand(syncCmd)
+}
diff --git a/deployers/manifestreader.go b/deployers/manifestreader.go
index fa541169..c9f02681 100644
--- a/deployers/manifestreader.go
+++ b/deployers/manifestreader.go
@@ -52,8 +52,8 @@ func (deployer *ManifestReader) ParseManifest() (*parsers.YAML, *parsers.YAMLPar
 	return manifest, manifestParser, nil
 }
 
-func (reader *ManifestReader) InitPackages(manifestParser *parsers.YAMLParser, manifest *parsers.YAML, ma whisk.KeyValue) error {
-	packages, err := manifestParser.ComposeAllPackages(manifest, reader.serviceDeployer.ManifestPath, ma)
+func (reader *ManifestReader) InitPackages(manifestParser *parsers.YAMLParser, manifest *parsers.YAML, managedAnnotations whisk.KeyValue) error {
+	packages, err := manifestParser.ComposeAllPackages(manifest, reader.serviceDeployer.ManifestPath, managedAnnotations)
 	if err != nil {
 		return err
 	}
@@ -63,32 +63,32 @@ func (reader *ManifestReader) InitPackages(manifestParser *parsers.YAMLParser, m
 }
 
 // Wrapper parser to handle yaml dir
-func (deployer *ManifestReader) HandleYaml(sdeployer *ServiceDeployer, manifestParser *parsers.YAMLParser, manifest *parsers.YAML, ma whisk.KeyValue) error {
+func (deployer *ManifestReader) HandleYaml(sdeployer *ServiceDeployer, manifestParser *parsers.YAMLParser, manifest *parsers.YAML, managedAnnotations whisk.KeyValue) error {
 
 	var err error
 	var manifestName = manifest.Filepath
 
-	deps, err := manifestParser.ComposeDependenciesFromAllPackages(manifest, deployer.serviceDeployer.ProjectPath, deployer.serviceDeployer.ManifestPath)
+	deps, err := manifestParser.ComposeDependenciesFromAllPackages(manifest, deployer.serviceDeployer.ProjectPath, deployer.serviceDeployer.ManifestPath, managedAnnotations)
 	if err != nil {
 		return wskderrors.NewYAMLFileFormatError(manifestName, err)
 	}
 
-	actions, err := manifestParser.ComposeActionsFromAllPackages(manifest, deployer.serviceDeployer.ManifestPath, ma)
+	actions, err := manifestParser.ComposeActionsFromAllPackages(manifest, deployer.serviceDeployer.ManifestPath, managedAnnotations)
 	if err != nil {
 		return wskderrors.NewYAMLFileFormatError(manifestName, err)
 	}
 
-	sequences, err := manifestParser.ComposeSequencesFromAllPackages(deployer.serviceDeployer.ClientConfig.Namespace, manifest, ma)
+	sequences, err := manifestParser.ComposeSequencesFromAllPackages(deployer.serviceDeployer.ClientConfig.Namespace, manifest, managedAnnotations)
 	if err != nil {
 		return wskderrors.NewYAMLFileFormatError(manifestName, err)
 	}
 
-	triggers, err := manifestParser.ComposeTriggersFromAllPackages(manifest, deployer.serviceDeployer.ManifestPath, ma)
+	triggers, err := manifestParser.ComposeTriggersFromAllPackages(manifest, deployer.serviceDeployer.ManifestPath, managedAnnotations)
 	if err != nil {
 		return wskderrors.NewYAMLFileFormatError(manifestName, err)
 	}
 
-	rules, err := manifestParser.ComposeRulesFromAllPackages(manifest, ma)
+	rules, err := manifestParser.ComposeRulesFromAllPackages(manifest, managedAnnotations)
 	if err != nil {
 		return wskderrors.NewYAMLFileFormatError(manifestName, err)
 	}
diff --git a/deployers/projectreader.go b/deployers/projectreader.go
new file mode 100644
index 00000000..84ee979f
--- /dev/null
+++ b/deployers/projectreader.go
@@ -0,0 +1,360 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package deployers
+
+import (
+	"net/http"
+	"strings"
+
+	"github.com/apache/incubator-openwhisk-client-go/whisk"
+	"github.com/apache/incubator-openwhisk-wskdeploy/parsers"
+	"github.com/apache/incubator-openwhisk-wskdeploy/utils"
+	"github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
+)
+
+func (deployer *ServiceDeployer) UnDeployProjectAssets() error {
+
+	// calculate all the project entities such as packages, actions, sequences,
+	// triggers, and rules based on the project name in "whisk-managed" annotation
+	deployer.SetProjectAssets(utils.Flags.ProjectName)
+	// calculate all the dependencies based on the project name
+	projectDeps, err := deployer.SetProjectDependencies(utils.Flags.ProjectName)
+	if err != nil {
+		return err
+	}
+
+	// show preview of which all OpenWhisk entities will be deployed
+	if utils.Flags.Preview {
+		deployer.printDeploymentAssets(deployer.Deployment)
+		for _, deps := range projectDeps {
+			deployer.printDeploymentAssets(deps)
+		}
+		return nil
+	}
+
+	// now, undeploy all those project dependencies if not used by
+	// any other project or packages
+	for _, deps := range projectDeps {
+		if err := deployer.unDeployAssets(deps); err != nil {
+			return err
+		}
+	}
+
+	// undeploy all the project entities
+	return deployer.unDeployAssets(deployer.Deployment)
+
+	return nil
+}
+
+// based on the project name set in "whisk-managed" annotation
+// calculate and determine list of packages, actions, sequences, rules and triggers
+func (deployer *ServiceDeployer) SetProjectAssets(projectName string) error {
+
+	if err := deployer.SetProjectPackages(projectName); err != nil {
+		return err
+	}
+
+	if err := deployer.SetPackageActionsAndSequences(projectName); err != nil {
+		return err
+	}
+
+	if err := deployer.SetProjectTriggers(projectName); err != nil {
+		return err
+	}
+
+	if err := deployer.SetProjectRules(projectName); err != nil {
+		return err
+	}
+
+	if err := deployer.SetProjectApis(projectName); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// check if project name matches with the one in "whisk-managed" annotation
+func (deployer *ServiceDeployer) isManagedEntity(a interface{}, projectName string) bool {
+	if a != nil {
+		ta := a.(map[string]interface{})
+		if ta[utils.OW_PROJECT_NAME] == projectName {
+			return true
+		}
+	}
+	return false
+}
+
+// get an instance of *whisk.Package for the specified package name
+func (deployer *ServiceDeployer) getPackage(packageName string) (*DeploymentPackage, error) {
+	var err error
+	var p *whisk.Package
+	var response *http.Response
+	err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error {
+		p, response, err = deployer.Client.Packages.Get(packageName)
+		return err
+	})
+	if err != nil {
+		return nil, createWhiskClientError(err.(*whisk.WskError), response, parsers.YAML_KEY_PACKAGE, false)
+	}
+	newPack := NewDeploymentPackage()
+	newPack.Package = p
+	return newPack, nil
+
+}
+
+// capture all the packages with "whisk-managed" annotations and matching project name
+func (deployer *ServiceDeployer) SetProjectPackages(projectName string) error {
+	// retrieve a list of all the packages available under the namespace
+	listOfPackages, _, err := deployer.Client.Packages.List(&whisk.PackageListOptions{})
+	if err != nil {
+		return nil
+	}
+	for _, pkg := range listOfPackages {
+		if deployer.isManagedEntity(pkg.Annotations.GetValue(utils.MANAGED), projectName) {
+			p, err := deployer.getPackage(pkg.Name)
+			if err != nil {
+				return err
+			}
+			deployer.Deployment.Packages[pkg.Name] = p
+		}
+	}
+
+	return nil
+}
+
+// get a list of actions/sequences of a given package name
+func (deployer *ServiceDeployer) getPackageActionsAndSequences(packageName string, projectName string) (map[string]utils.ActionRecord, map[string]utils.ActionRecord, error) {
+	listOfActions := make(map[string]utils.ActionRecord, 0)
+	listOfSequences := make(map[string]utils.ActionRecord, 0)
+
+	actions, _, err := deployer.Client.Actions.List(packageName, &whisk.ActionListOptions{})
+	if err != nil {
+		return listOfActions, listOfSequences, err
+	}
+	for _, action := range actions {
+		if deployer.isManagedEntity(action.Annotations.GetValue(utils.MANAGED), projectName) {
+			var a *whisk.Action
+			var response *http.Response
+			err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error {
+				a, response, err = deployer.Client.Actions.Get(packageName+parsers.PATH_SEPARATOR+action.Name, false)
+				return err
+			})
+			if err != nil {
+				return listOfActions, listOfSequences, createWhiskClientError(err.(*whisk.WskError), response, parsers.YAML_KEY_ACTION, false)
+			}
+			ar := utils.ActionRecord{Action: a, Packagename: packageName}
+			if a.Exec.Kind == parsers.YAML_KEY_SEQUENCE {
+				listOfSequences[action.Name] = ar
+			} else {
+				listOfActions[action.Name] = ar
+			}
+		}
+	}
+	return listOfActions, listOfSequences, err
+}
+
+// capture all the actions/sequences with "whisk-managed" annotations and matching project name
+func (deployer *ServiceDeployer) SetPackageActionsAndSequences(projectName string) error {
+	for _, pkg := range deployer.Deployment.Packages {
+		a, s, err := deployer.getPackageActionsAndSequences(pkg.Package.Name, projectName)
+		if err != nil {
+			return err
+		}
+		deployer.Deployment.Packages[pkg.Package.Name].Actions = a
+		deployer.Deployment.Packages[pkg.Package.Name].Sequences = s
+	}
+	return nil
+}
+
+// get a list of triggers from a given project name
+func (deployer *ServiceDeployer) getProjectTriggers(projectName string) (map[string]*whisk.Trigger, error) {
+	triggers := make(map[string]*whisk.Trigger, 0)
+	listOfTriggers, _, err := deployer.Client.Triggers.List(&whisk.TriggerListOptions{})
+	if err != nil {
+		return triggers, nil
+	}
+	for _, trigger := range listOfTriggers {
+		if deployer.isManagedEntity(trigger.Annotations.GetValue(utils.MANAGED), projectName) {
+			var t *whisk.Trigger
+			var response *http.Response
+			err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error {
+				t, response, err = deployer.Client.Triggers.Get(trigger.Name)
+				return err
+			})
+			if err != nil {
+				return triggers, createWhiskClientError(err.(*whisk.WskError), response, parsers.YAML_KEY_TRIGGER, false)
+			}
+			triggers[trigger.Name] = t
+		}
+	}
+	return triggers, nil
+}
+
+// capture all the triggers with "whisk-managed" annotations and matching project name
+func (deployer *ServiceDeployer) SetProjectTriggers(projectName string) error {
+	t, err := deployer.getProjectTriggers(projectName)
+	if err != nil {
+		return err
+	}
+	deployer.Deployment.Triggers = t
+	return nil
+}
+
+// get a list of rules from a given project name
+func (deployer *ServiceDeployer) getProjectRules(projectName string) (map[string]*whisk.Rule, error) {
+	rules := make(map[string]*whisk.Rule, 0)
+	listOfRules, _, err := deployer.Client.Rules.List(&whisk.RuleListOptions{})
+	if err != nil {
+		return rules, nil
+	}
+	for _, rule := range listOfRules {
+		if deployer.isManagedEntity(rule.Annotations.GetValue(utils.MANAGED), projectName) {
+			var r *whisk.Rule
+			var response *http.Response
+			err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error {
+				r, response, err = deployer.Client.Rules.Get(rule.Name)
+				return err
+			})
+			if err != nil {
+				return rules, createWhiskClientError(err.(*whisk.WskError), response, parsers.YAML_KEY_RULE, false)
+			}
+			rules[rule.Name] = r
+		}
+	}
+	return rules, nil
+}
+
+// capture all the rules with "whisk-managed" annotations and matching project name
+func (deployer *ServiceDeployer) SetProjectRules(projectName string) error {
+	r, err := deployer.getProjectRules(projectName)
+	if err != nil {
+		return err
+	}
+	deployer.Deployment.Rules = r
+	return nil
+}
+
+// "whisk-manged" annotation stores package name with namespace such as
+// /<namespace>/<package name>
+// parse this kind of structure to determine package name
+func (deployer *ServiceDeployer) filterPackageName(name string) string {
+	s := strings.SplitAfterN(name, "/", 3)
+	if len(s) == 3 && len(s[2]) != 0 {
+		return s[2]
+	}
+	return ""
+}
+
+// determine if any other package on the server is using the dependent package
+func (deployer *ServiceDeployer) isPackageUsedByOtherPackages(projectName string, depPackageName string) bool {
+	// retrieve a list of packages on the server
+	listOfPackages, _, err := deployer.Client.Packages.List(&whisk.PackageListOptions{})
+	if err != nil {
+		return false
+	}
+	for _, pkg := range listOfPackages {
+		if a := pkg.Annotations.GetValue(utils.MANAGED); a != nil {
+			ta := a.(map[string]interface{})
+			// compare project names of the given package and other packages from server
+			// we want to skip comparing packages from the same project
+			if ta[utils.OW_PROJECT_NAME] != projectName {
+				d := a.(map[string]interface{})[utils.OW_PROJECT_DEPS]
+				listOfDeps := d.([]interface{})
+				// iterate over a list of dependencies of a package
+				// to determine whether it has listed the dependent package as its dependency as well
+				// in such case, we dont want to undeploy dependent package if its used by any other package
+				for _, dep := range listOfDeps {
+					name := deployer.filterPackageName(dep.(map[string]interface{})[wski18n.KEY_KEY].(string))
+					if name == depPackageName {
+						return true
+					}
+
+				}
+
+			}
+
+		}
+	}
+	return false
+}
+
+// derive a map of dependent packages using "whisk-managed" annotation
+// "whisk-managed" annotation has a list of dependent packages in "projectDeps"
+// projectDeps is a list of key value pairs with its own "whisk-managed" annotation
+// for a given package, get the list of dependent packages
+// for each dependent package, determine whether any other package is using it or not
+// if not, collect a list of actions, sequences, triggers, and rules of the dependent package
+// and delete them in order following by deleting the package itself
+func (deployer *ServiceDeployer) SetProjectDependencies(projectName string) ([]*DeploymentProject, error) {
+	projectDependencies := make([]*DeploymentProject, 0)
+	// iterate over each package in a given project
+	for _, pkg := range deployer.Deployment.Packages {
+		// get the "whisk-managed" annotation
+		if a := pkg.Package.Annotations.GetValue(utils.MANAGED); a != nil {
+			// read the list of dependencies from "projectDeps"
+			d := a.(map[string]interface{})[utils.OW_PROJECT_DEPS]
+			listOfDeps := d.([]interface{})
+			// iterate over a list of dependencies
+			for _, dep := range listOfDeps {
+				// dependent package name is in form of "/<namespace>/<package-name>
+				// filter it to derive the package name
+				name := deployer.filterPackageName(dep.(map[string]interface{})[wski18n.KEY_KEY].(string))
+				// undeploy dependent package if its not used by any other package
+				if !deployer.isPackageUsedByOtherPackages(projectName, name) {
+					// get the *whisk.Package object for the given dependent package
+					p, err := deployer.getPackage(name)
+					if err != nil {
+						return projectDependencies, err
+					}
+					// construct a new DeploymentProject for each dependency
+					depProject := NewDeploymentProject()
+					depProject.Packages[p.Package.Name] = p
+					// Now, get the project name of dependent package so that
+					// we can get other entities from that project
+					pa := p.Package.Annotations.GetValue(utils.MANAGED)
+					depProjectName := (pa.(map[string]interface{})[utils.OW_PROJECT_NAME]).(string)
+					// get a list of actions and sequences of a dependent package
+					actions, sequences, err := deployer.getPackageActionsAndSequences(p.Package.Name, depProjectName)
+					if err != nil {
+						return projectDependencies, err
+					}
+					depProject.Packages[p.Package.Name].Actions = actions
+					depProject.Packages[p.Package.Name].Sequences = sequences
+					// get a list of triggers of a dependent project
+					t, err := deployer.getProjectTriggers(depProjectName)
+					if err != nil {
+						return projectDependencies, err
+					}
+					depProject.Triggers = t
+					// get a list of rules of a dependent project
+					r, err := deployer.getProjectRules(depProjectName)
+					if err != nil {
+						return projectDependencies, err
+					}
+					depProject.Rules = r
+					projectDependencies = append(projectDependencies, depProject)
+				}
+			}
+		}
+	}
+	return projectDependencies, nil
+}
+
+func (deployer *ServiceDeployer) SetProjectApis(projectName string) error {
+	return nil
+}
diff --git a/deployers/servicedeployer.go b/deployers/servicedeployer.go
index 023e18ee..2d417b0c 100644
--- a/deployers/servicedeployer.go
+++ b/deployers/servicedeployer.go
@@ -139,7 +139,7 @@ func (deployer *ServiceDeployer) ConstructDeploymentPlan() error {
 	// Generate Managed Annotations if its marked as a Managed Deployment
 	// Managed deployments are the ones when OpenWhisk entities are deployed with command line flag --managed.
 	// Which results in a hidden annotation in every OpenWhisk entity in manifest file.
-	if utils.Flags.Managed {
+	if utils.Flags.Managed || utils.Flags.Sync {
 		// OpenWhisk entities are annotated with Project Name and therefore
 		// Project Name in manifest/deployment file is mandatory for managed deployments
 		if deployer.ProjectName == "" {
@@ -309,7 +309,7 @@ func (deployer *ServiceDeployer) deployAssets() error {
 	// refresh previously deployed project entities, delete the assets which is no longer part of the project
 	// i.e. in a subsequent managed deployment of the same project minus few OpenWhisk entities
 	// from the manifest file must result in undeployment of those deleted entities
-	if utils.Flags.Managed {
+	if utils.Flags.Managed || utils.Flags.Sync {
 		if err := deployer.RefreshManagedEntities(deployer.ManagedAnnotation); err != nil {
 			errString := wski18n.T(wski18n.ID_MSG_MANAGED_UNDEPLOYMENT_FAILED)
 			whisk.Debug(whisk.DbgError, errString)
@@ -436,6 +436,9 @@ func (deployer *ServiceDeployer) RefreshManagedEntities(maValue whisk.KeyValue)
 		return err
 	}
 
+	if err := deployer.RefreshManagedPackagesWithDependencies(ma); err != nil {
+		return err
+	}
 	return nil
 
 }
@@ -612,6 +615,74 @@ func (deployer *ServiceDeployer) RefreshManagedPackages(ma map[string]interface{
 			}
 		}
 	}
+
+	return nil
+}
+
+func (deployer *ServiceDeployer) appendDepAnnotation(list whisk.KeyValueArr, pkg *whisk.Package) whisk.KeyValueArr {
+	depExists := false
+	if a := pkg.Annotations.GetValue(utils.MANAGED); a != nil {
+		//append annotations from this package to deps
+		pkgName := parsers.PATH_SEPARATOR + pkg.Namespace + parsers.PATH_SEPARATOR + pkg.Name
+		for _, dep := range list {
+			if dep.Key == pkgName {
+				depExists = true
+			}
+		}
+		if !depExists {
+			list = append(list, whisk.KeyValue{Key: pkgName, Value: a.(map[string]interface{})})
+		}
+	}
+	return list
+}
+
+func (deployer *ServiceDeployer) RefreshManagedPackagesWithDependencies(ma map[string]interface{}) error {
+	// iterate over each package from the given project
+	for _, p := range deployer.Deployment.Packages {
+		dependencyAnnotations := make(whisk.KeyValueArr, 0)
+		// iterate over the list of dependencies of the package
+		// dependencies could be labeled same as dependent package name
+		// for example, "helloworld" where the package it depends on is also called "helloworld"
+		// dependencies could be labeled different from the dependent package name
+		// for example, "custom-helloworld" where the package it depends on it called "helloworld"
+		for n := range p.Dependencies {
+			// find the package using dependency label
+			pkg, _, err := deployer.Client.Packages.Get(n)
+			if err != nil {
+				return err
+			}
+			// if dependency label (custom-helloworld) is different from the dependent package name,
+			// it must have binding set to the original package ("helloworld")
+			if len(pkg.Binding.Name) != 0 {
+				// having dependency on packages under /whisk.system is treated in a different way
+				// in which dependent package under /whisk.system are not modified to add managed annotation
+				// and parent package does not show this dependency in its managed annotation
+				// because whisk.system packages comes pre-packaged and deployed with OpenWhisk server and not
+				// deployed along with application deployments.
+				// (TODO) here, we are only finding a package with its name as Get method
+				// (TODO) does not support looking under different/seperate namespace
+				// (TODO) we could add support to sync dependencies from different namespaces in future
+				if pkg.Binding.Namespace != utils.WHISK_SYSTEM {
+					// get the original package to retrieve its managed annotations
+					pkg, _, err := deployer.Client.Packages.Get(pkg.Binding.Name)
+					if err != nil {
+						return err
+					}
+					dependencyAnnotations = deployer.appendDepAnnotation(dependencyAnnotations, pkg)
+				}
+			} else {
+				dependencyAnnotations = deployer.appendDepAnnotation(dependencyAnnotations, pkg)
+			}
+		}
+		updatedAnnotation, err := utils.AddDependentAnnotation(ma, dependencyAnnotations)
+		if err != nil {
+			return err
+		}
+		p.Package.Annotations.AddOrReplace(&updatedAnnotation)
+	}
+	if err := deployer.DeployPackages(); err != nil {
+		return err
+	}
 	return nil
 }
 
@@ -935,6 +1006,13 @@ func (deployer *ServiceDeployer) UnDeploy(verifiedPlan *DeploymentProject) error
 	return nil
 }
 
+func (deployer *ServiceDeployer) UnDeployProject() error {
+	if err := deployer.UnDeployProjectAssets(); err != nil {
+		return err
+	}
+	return nil
+}
+
 func (deployer *ServiceDeployer) unDeployAssets(verifiedPlan *DeploymentProject) error {
 	if err := deployer.UnDeployApis(verifiedPlan); err != nil {
 		return err
@@ -1355,10 +1433,10 @@ func (deployer *ServiceDeployer) printDeploymentAssets(assets *DeploymentProject
 	wskprint.PrintlnOpenWhiskOutput("         ____      ___                   _    _ _     _     _\n        /\\   \\    / _ \\ _ __   ___ _ __ | |  | | |__ (_)___| | __\n   /\\  /__\\   \\  | | | | '_ \\ / _ \\ '_ \\| |  | | '_ \\| / __| |/ /\n  /  \\____ \\  /  | |_| | |_) |  __/ | | | |/\\| | | | | \\__ \\   <\n  \\   \\  /  \\/    \\___/| .__/ \\___|_| |_|__/\\__|_| |_|_|___/_|\\_\\ \n   \\___\\/              |_|\n")
 
 	// TODO() review format
-	wskprint.PrintlnOpenWhiskOutput("Packages:")
+	wskprint.PrintlnOpenWhiskOutput(strings.Title(parsers.YAML_KEY_PACKAGES) + ":")
 	for _, pack := range assets.Packages {
-		wskprint.PrintlnOpenWhiskOutput("Name: " + pack.Package.Name)
-		wskprint.PrintlnOpenWhiskOutput("    bindings: ")
+		wskprint.PrintlnOpenWhiskOutput(strings.Title(wski18n.KEY_NAME) + ": " + pack.Package.Name)
+		wskprint.PrintlnOpenWhiskOutput("    " + wski18n.KEY_BINDINGS + ": ")
 		for _, p := range pack.Package.Parameters {
 			jsonValue, err := utils.PrettyJSON(p.Value)
 			if err != nil {
@@ -1368,19 +1446,25 @@ func (deployer *ServiceDeployer) printDeploymentAssets(assets *DeploymentProject
 			}
 		}
 
+		wskprint.PrintlnOpenWhiskOutput("    " + parsers.YAML_KEY_ANNOTATION + ": ")
+		for _, p := range pack.Package.Annotations {
+			fmt.Printf("        - %s : %v\n", p.Key, p.Value)
+
+		}
+
 		for key, dep := range pack.Dependencies {
-			wskprint.PrintlnOpenWhiskOutput("  * dependency: " + key)
-			wskprint.PrintlnOpenWhiskOutput("    location: " + dep.Location)
+			wskprint.PrintlnOpenWhiskOutput("  * " + wski18n.KEY_DEPENDENCY + ": " + key)
+			wskprint.PrintlnOpenWhiskOutput("    " + wski18n.KEY_LOCATION + ": " + dep.Location)
 			if !dep.IsBinding {
-				wskprint.PrintlnOpenWhiskOutput("    local path: " + dep.ProjectPath)
+				wskprint.PrintlnOpenWhiskOutput("    " + wski18n.KEY_PATH + ": " + dep.ProjectPath)
 			}
 		}
 
 		wskprint.PrintlnOpenWhiskOutput("")
 
 		for _, action := range pack.Actions {
-			wskprint.PrintlnOpenWhiskOutput("  * action: " + action.Action.Name)
-			wskprint.PrintlnOpenWhiskOutput("    bindings: ")
+			wskprint.PrintlnOpenWhiskOutput("  * " + parsers.YAML_KEY_ACTION + ": " + action.Action.Name)
+			wskprint.PrintlnOpenWhiskOutput("    " + wski18n.KEY_BINDINGS + ": ")
 			for _, p := range action.Action.Parameters {
 
 				if reflect.TypeOf(p.Value).Kind() == reflect.Map {
@@ -1405,7 +1489,7 @@ func (deployer *ServiceDeployer) printDeploymentAssets(assets *DeploymentProject
 				}
 
 			}
-			wskprint.PrintlnOpenWhiskOutput("    annotations: ")
+			wskprint.PrintlnOpenWhiskOutput("    " + parsers.YAML_KEY_ANNOTATION + ": ")
 			for _, p := range action.Action.Annotations {
 				fmt.Printf("        - %s : %v\n", p.Key, p.Value)
 
@@ -1414,16 +1498,21 @@ func (deployer *ServiceDeployer) printDeploymentAssets(assets *DeploymentProject
 
 		wskprint.PrintlnOpenWhiskOutput("")
 		for _, action := range pack.Sequences {
-			wskprint.PrintlnOpenWhiskOutput("  * sequence: " + action.Action.Name)
+			wskprint.PrintlnOpenWhiskOutput("  * " + parsers.YAML_KEY_SEQUENCE + ": " + action.Action.Name)
+			wskprint.PrintlnOpenWhiskOutput("    " + parsers.YAML_KEY_ANNOTATION + ": ")
+			for _, p := range action.Action.Annotations {
+				fmt.Printf("        - %s : %v\n", p.Key, p.Value)
+
+			}
 		}
 
 		wskprint.PrintlnOpenWhiskOutput("")
 	}
 
-	wskprint.PrintlnOpenWhiskOutput("Triggers:")
+	wskprint.PrintlnOpenWhiskOutput(wski18n.TRIGGERS + ":")
 	for _, trigger := range assets.Triggers {
-		wskprint.PrintlnOpenWhiskOutput("* trigger: " + trigger.Name)
-		wskprint.PrintlnOpenWhiskOutput("    bindings: ")
+		wskprint.PrintlnOpenWhiskOutput("* " + parsers.YAML_KEY_TRIGGER + ": " + trigger.Name)
+		wskprint.PrintlnOpenWhiskOutput("    " + wski18n.KEY_BINDINGS + ": ")
 
 		for _, p := range trigger.Parameters {
 			jsonValue, err := utils.PrettyJSON(p.Value)
@@ -1434,21 +1523,31 @@ func (deployer *ServiceDeployer) printDeploymentAssets(assets *DeploymentProject
 			}
 		}
 
-		wskprint.PrintlnOpenWhiskOutput("    annotations: ")
+		wskprint.PrintlnOpenWhiskOutput("    " + parsers.YAML_KEY_ANNOTATION + ": ")
 		for _, p := range trigger.Annotations {
+			fmt.Printf("        - %s : %v\n", p.Key, p.Value)
 
-			value := "?"
-			if str, ok := p.Value.(string); ok {
-				value = str
-			}
-			wskprint.PrintlnOpenWhiskOutput("        - name: " + p.Key + " value: " + value)
 		}
 	}
 
-	wskprint.PrintlnOpenWhiskOutput("\n Rules")
+	wskprint.PrintlnOpenWhiskOutput("\n" + wski18n.RULES)
 	for _, rule := range assets.Rules {
-		wskprint.PrintlnOpenWhiskOutput("* rule: " + rule.Name)
-		wskprint.PrintlnOpenWhiskOutput("    - trigger: " + rule.Trigger.(string) + "\n    - action: " + rule.Action.(string))
+		wskprint.PrintlnOpenWhiskOutput("* " + parsers.YAML_KEY_RULE + ": " + rule.Name)
+		wskprint.PrintlnOpenWhiskOutput("    " + parsers.YAML_KEY_ANNOTATION + ": ")
+		for _, p := range rule.Annotations {
+			fmt.Printf("        - %s : %v\n", p.Key, p.Value)
+
+		}
+		if reflect.TypeOf(rule.Trigger).Kind() == reflect.String {
+			wskprint.PrintlnOpenWhiskOutput("    - " + parsers.YAML_KEY_TRIGGER + ": " + rule.Trigger.(string) + "\n    - " + parsers.YAML_KEY_ACTION + ": " + rule.Action.(string))
+		} else if reflect.TypeOf(rule.Trigger).Kind() == reflect.Map {
+			trigger := rule.Trigger.(map[string]interface{})
+			triggerName := trigger["path"].(string) + parsers.PATH_SEPARATOR + trigger["name"].(string)
+			action := rule.Action.(map[string]interface{})
+			actionName := action["path"].(string) + parsers.PATH_SEPARATOR + action["name"].(string)
+			wskprint.PrintlnOpenWhiskOutput("    - " + parsers.YAML_KEY_TRIGGER + ": " + triggerName + "\n    - " + parsers.YAML_KEY_ACTION + ": " + actionName)
+		}
+
 	}
 
 	wskprint.PrintlnOpenWhiskOutput("")
diff --git a/parsers/manifest_parser.go b/parsers/manifest_parser.go
index 763dcbca..88f8d9f0 100644
--- a/parsers/manifest_parser.go
+++ b/parsers/manifest_parser.go
@@ -141,7 +141,7 @@ func (dm *YAMLParser) composeAnnotations(annotations map[string]interface{}) whi
 	return listOfAnnotations
 }
 
-func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *YAML, projectPath string, filePath string) (map[string]utils.DependencyRecord, error) {
+func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *YAML, projectPath string, filePath string, ma whisk.KeyValue) (map[string]utils.DependencyRecord, error) {
 	dependencies := make(map[string]utils.DependencyRecord)
 	packages := make(map[string]Package)
 
@@ -152,7 +152,7 @@ func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *YAML, project
 	}
 
 	for n, p := range packages {
-		d, err := dm.ComposeDependencies(p, projectPath, filePath, n)
+		d, err := dm.ComposeDependencies(p, projectPath, filePath, n, ma)
 		if err == nil {
 			for k, v := range d {
 				dependencies[k] = v
@@ -164,7 +164,7 @@ func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *YAML, project
 	return dependencies, nil
 }
 
-func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, filePath string, packageName string) (map[string]utils.DependencyRecord, error) {
+func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, filePath string, packageName string, ma whisk.KeyValue) (map[string]utils.DependencyRecord, error) {
 
 	depMap := make(map[string]utils.DependencyRecord)
 	for key, dependency := range pkg.Dependencies {
@@ -201,6 +201,10 @@ func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, fileP
 
 		annotations := dm.composeAnnotations(dependency.Annotations)
 
+		if utils.Flags.Managed || utils.Flags.Sync {
+			annotations = append(annotations, ma)
+		}
+
 		packDir := path.Join(projectPath, strings.Title(YAML_KEY_PACKAGES))
 		depName := packageName + ":" + key
 		depMap[depName] = utils.NewDependencyRecord(packDir, packageName, location, version, inputs, annotations, isBinding)
@@ -308,7 +312,7 @@ func (dm *YAMLParser) ComposePackage(pkg Package, packageName string, filePath s
 	}
 
 	// add Managed Annotations if this is Managed Deployment
-	if utils.Flags.Managed {
+	if utils.Flags.Managed || utils.Flags.Sync {
 		pag.Annotations = append(pag.Annotations, ma)
 	}
 
@@ -383,7 +387,7 @@ func (dm *YAMLParser) ComposeSequences(namespace string, sequences map[string]Se
 		}
 
 		// appending managed annotations if its a managed deployment
-		if utils.Flags.Managed {
+		if utils.Flags.Managed || utils.Flags.Sync {
 			wskaction.Annotations = append(wskaction.Annotations, ma)
 		}
 
@@ -756,7 +760,7 @@ func (dm *YAMLParser) ComposeActions(manifestFilePath string, actions map[string
 		}
 
 		// add managed annotations if its marked as managed deployment
-		if utils.Flags.Managed {
+		if utils.Flags.Managed || utils.Flags.Sync {
 			wskaction.Annotations = append(wskaction.Annotations, ma)
 		}
 
@@ -864,7 +868,7 @@ func (dm *YAMLParser) ComposeTriggers(filePath string, pkg Package, ma whisk.Key
 		}
 
 		// add managed annotations if its a managed deployment
-		if utils.Flags.Managed {
+		if utils.Flags.Managed || utils.Flags.Sync {
 			wsktrigger.Annotations = append(wsktrigger.Annotations, ma)
 		}
 
@@ -917,7 +921,7 @@ func (dm *YAMLParser) ComposeRules(pkg Package, packageName string, ma whisk.Key
 		}
 
 		// add managed annotations if its a managed deployment
-		if utils.Flags.Managed {
+		if utils.Flags.Managed || utils.Flags.Sync {
 			wskrule.Annotations = append(wskrule.Annotations, ma)
 		}
 
diff --git a/parsers/manifest_parser_test.go b/parsers/manifest_parser_test.go
index bc6948eb..f96ebc14 100644
--- a/parsers/manifest_parser_test.go
+++ b/parsers/manifest_parser_test.go
@@ -1332,7 +1332,7 @@ func TestComposeDependencies(t *testing.T) {
 	file := "../tests/dat/manifest_data_compose_dependencies.yaml"
 	p, m, _ := testLoadParseManifest(t, file)
 
-	depdList, err := p.ComposeDependenciesFromAllPackages(m, "/project_folder", m.Filepath)
+	depdList, err := p.ComposeDependenciesFromAllPackages(m, "/project_folder", m.Filepath, whisk.KeyValue{})
 	assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_COMPOSE_DEPENDENCY_FAILURE, file))
 
 	assert.Equal(t, 3, len(depdList), "Failed to get rules")
diff --git a/tests/src/integration/common/wskdeploy.go b/tests/src/integration/common/wskdeploy.go
index 2eb18e56..17755a99 100644
--- a/tests/src/integration/common/wskdeploy.go
+++ b/tests/src/integration/common/wskdeploy.go
@@ -167,15 +167,11 @@ func (wskdeploy *Wskdeploy) UndeployManifestPathOnly(manifestpath string) (strin
 }
 
 func (Wskdeploy *Wskdeploy) ManagedDeployment(manifestPath string, deploymentPath string) (string, error) {
-	return Wskdeploy.RunCommand("-m", manifestPath, "-d", deploymentPath, "--managed")
+	return Wskdeploy.RunCommand("sync", "-m", manifestPath, "-d", deploymentPath)
 }
 
 func (Wskdeploy *Wskdeploy) HeadlessManagedDeployment(manifestPath string, deploymentPath string, name string) (string, error) {
-	return Wskdeploy.RunCommand("-m", manifestPath, "-d", deploymentPath, "--managed", "--projectname", name)
-}
-
-func (Wskdeploy *Wskdeploy) ManagedUndeployment(manifestPath string, deploymentPath string) (string, error) {
-	return Wskdeploy.RunCommand("undeploy", "-m", manifestPath, "-d", deploymentPath, "--managed")
+	return Wskdeploy.RunCommand("sync", "-m", manifestPath, "-d", deploymentPath, "--projectname", name)
 }
 
 // This method is only for testing
diff --git a/tests/src/integration/managed-deployment/06-manifest-with-dependency.yaml b/tests/src/integration/managed-deployment/06-manifest-with-dependency.yaml
new file mode 100644
index 00000000..0cbe8483
--- /dev/null
+++ b/tests/src/integration/managed-deployment/06-manifest-with-dependency.yaml
@@ -0,0 +1,40 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more contributor
+# license agreements.  See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this
+# file except in compliance with the License.  You may obtain a copy of the License
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+
+project:
+    name: MyManagedProjectWithDependency
+    packages:
+        Extension1:
+            dependencies:
+                helloworlds:
+                    location: github.com/pritidesai/incubator-openwhisk-test/packages/helloworlds
+                custom-hellowhisk:
+                    location: github.com/pritidesai/incubator-openwhisk-test/packages/hellowhisk
+                custom-helloworlds:
+                    location: github.com/pritidesai/incubator-openwhisk-test/packages/helloworlds
+            sequences:
+                helloworld-sequence:
+                   actions: custom-helloworlds/hello-js, custom-hellowhisk/greeting, helloworlds/hello-js
+            triggers:
+                trigger1:
+                trigger2:
+            rules:
+                rule1:
+                    trigger: trigger1
+                    action: helloworld-sequence
+                rule2:
+                    trigger: trigger2
+                    action: custom-helloworlds/helloworld-js
diff --git a/tests/src/integration/managed-deployment/07-manifest-with-single-dependency.yaml b/tests/src/integration/managed-deployment/07-manifest-with-single-dependency.yaml
new file mode 100644
index 00000000..903fd0e7
--- /dev/null
+++ b/tests/src/integration/managed-deployment/07-manifest-with-single-dependency.yaml
@@ -0,0 +1,29 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more contributor
+# license agreements.  See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this
+# file except in compliance with the License.  You may obtain a copy of the License
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+
+project:
+    name: MyManagedProjectWithSingleDependency
+    packages:
+        Extension2:
+            dependencies:
+                helloworlds:
+                    location: github.com/pritidesai/incubator-openwhisk-test/packages/helloworlds
+            triggers:
+                triggerInExtension2:
+            rules:
+                ruleInExtension2:
+                    trigger: triggerInExtension2
+                    action: helloworlds/helloworld-js
diff --git a/tests/src/integration/managed-deployment/08-manifest-with-dependencies-on-whisk-system.yaml b/tests/src/integration/managed-deployment/08-manifest-with-dependencies-on-whisk-system.yaml
new file mode 100644
index 00000000..612feeb1
--- /dev/null
+++ b/tests/src/integration/managed-deployment/08-manifest-with-dependencies-on-whisk-system.yaml
@@ -0,0 +1,29 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more contributor
+# license agreements.  See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this
+# file except in compliance with the License.  You may obtain a copy of the License
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+
+project:
+    name: MyManagedProjectWithWhiskSystemDependency
+    packages:
+        Extension3:
+            dependencies:
+                whiskUtility:
+                    location: /whisk.system/utils
+            triggers:
+                triggerInExtension3:
+            rules:
+                ruleInExtension3:
+                    trigger: triggerInExtension3
+                    action: whiskUtility/sort
diff --git a/tests/src/integration/managed-deployment/managed-deployment_test.go b/tests/src/integration/managed-deployment/managed-deployment_test.go
index 119296d2..475ab71b 100644
--- a/tests/src/integration/managed-deployment/managed-deployment_test.go
+++ b/tests/src/integration/managed-deployment/managed-deployment_test.go
@@ -27,41 +27,61 @@ import (
 	"github.com/stretchr/testify/assert"
 )
 
+const PATH = "/src/github.com/apache/incubator-openwhisk-wskdeploy/tests/src/integration/managed-deployment/"
+
 func TestManagedDeployment(t *testing.T) {
-	path := "/src/github.com/apache/incubator-openwhisk-wskdeploy/tests/src/integration/managed-deployment/"
-	manifestPath := os.Getenv("GOPATH") + path + "manifest.yaml"
+	manifestPath := os.Getenv("GOPATH") + PATH + "manifest.yaml"
 	deploymentPath := ""
 	wskdeploy := common.NewWskdeploy()
 	_, err := wskdeploy.ManagedDeployment(manifestPath, deploymentPath)
 	assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
 
-	manifestPath = os.Getenv("GOPATH") + path + "00-manifest-minus-second-package.yaml"
-	wskdeploy = common.NewWskdeploy()
+	manifestPath = os.Getenv("GOPATH") + PATH + "00-manifest-minus-second-package.yaml"
 	_, err = wskdeploy.ManagedDeployment(manifestPath, deploymentPath)
 	assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
 
-	manifestPath = os.Getenv("GOPATH") + path + "01-manifest-minus-sequence-2.yaml"
-	wskdeploy = common.NewWskdeploy()
+	manifestPath = os.Getenv("GOPATH") + PATH + "01-manifest-minus-sequence-2.yaml"
 	_, err = wskdeploy.ManagedDeployment(manifestPath, deploymentPath)
 	assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
 
-	manifestPath = os.Getenv("GOPATH") + path + "02-manifest-minus-action-3.yaml"
-	wskdeploy = common.NewWskdeploy()
+	manifestPath = os.Getenv("GOPATH") + PATH + "02-manifest-minus-action-3.yaml"
 	_, err = wskdeploy.ManagedDeployment(manifestPath, deploymentPath)
 	assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
 
-	manifestPath = os.Getenv("GOPATH") + path + "03-manifest-minus-trigger.yaml"
-	wskdeploy = common.NewWskdeploy()
+	manifestPath = os.Getenv("GOPATH") + PATH + "03-manifest-minus-trigger.yaml"
 	_, err = wskdeploy.ManagedDeployment(manifestPath, deploymentPath)
 	assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
 
-	manifestPath = os.Getenv("GOPATH") + path + "04-manifest-minus-package.yaml"
-	wskdeploy = common.NewWskdeploy()
+	manifestPath = os.Getenv("GOPATH") + PATH + "04-manifest-minus-package.yaml"
 	_, err = wskdeploy.ManagedDeployment(manifestPath, deploymentPath)
 	assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
 
-	manifestPath = os.Getenv("GOPATH") + path + "05-manifest-headless.yaml"
-	wskdeploy = common.NewWskdeploy()
+	manifestPath = os.Getenv("GOPATH") + PATH + "05-manifest-headless.yaml"
 	_, err = wskdeploy.HeadlessManagedDeployment(manifestPath, deploymentPath, "Headless Managed")
 	assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
+	_, err = wskdeploy.Undeploy(manifestPath, deploymentPath)
+	assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
+
+}
+
+func TestManagedDeploymentWithDependency(t *testing.T) {
+	manifestPath := os.Getenv("GOPATH") + PATH + "06-manifest-with-dependency.yaml"
+	deploymentPath := ""
+	wskdeploy := common.NewWskdeploy()
+	_, err := wskdeploy.ManagedDeployment(manifestPath, deploymentPath)
+	assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
+	_, err = wskdeploy.Undeploy(manifestPath, deploymentPath)
+	assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
+
+	manifestPath = os.Getenv("GOPATH") + PATH + "07-manifest-with-single-dependency.yaml"
+	_, err = wskdeploy.ManagedDeployment(manifestPath, deploymentPath)
+	assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
+	_, err = wskdeploy.Undeploy(manifestPath, deploymentPath)
+	assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
+
+	//manifestPath = os.Getenv("GOPATH") + PATH + "08-manifest-with-dependencies-on-whisk-system.yaml"
+	//_, err = wskdeploy.ManagedDeployment(manifestPath, deploymentPath)
+	//assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
+	//_, err = wskdeploy.Undeploy(manifestPath, deploymentPath)
+	//assert.Equal(t, nil, err, "Failed to deploy based on the manifest and deployment files.")
 }
diff --git a/utils/flags.go b/utils/flags.go
index 278527e0..7d42cdef 100644
--- a/utils/flags.go
+++ b/utils/flags.go
@@ -42,6 +42,7 @@ type WskDeployFlags struct {
 	ApigwAccessToken string
 	Verbose          bool
 	Trace            bool
+	Sync             bool
 }
 
 func (flags *WskDeployFlags) Format() string {
diff --git a/utils/managedannotations.go b/utils/managedannotations.go
index fa0781ee..858b2b57 100644
--- a/utils/managedannotations.go
+++ b/utils/managedannotations.go
@@ -35,17 +35,20 @@ import (
  */
 
 const (
-	MANAGED         = "managed"
+	MANAGED         = "whisk-managed"
 	OPENWHISK       = "OpenWhisk"
 	NULL            = "golang\000"
-	OW_PROJECT_NAME = "__OW_PROJECT_NAME"
-	OW_PROJECT_HASH = "__OW_PROJECT_HASH"
+	OW_PROJECT_NAME = "projectName"
+	OW_PROJECT_HASH = "projectHash"
+	OW_PROJECT_DEPS = "projectDeps"
+	OW_File         = "file"
 )
 
 type ManagedAnnotation struct {
-	ProjectName string `json:"__OW_PROJECT_NAME"`
-	ProjectHash string `json:"__OW_PROJECT_HASH"`
-	File        string `json:"__OW_FILE"`
+	ProjectName string            `json:"projectName"`
+	ProjectHash string            `json:"projectHash"`
+	File        string            `json:"file"`
+	Deps        whisk.KeyValueArr `json:"projectDeps"`
 }
 
 // Project Hash is generated based on the following formula:
@@ -100,13 +103,38 @@ func GenerateManagedAnnotation(projectName string, filePath string) (whisk.KeyVa
 		ProjectName: projectName,
 		ProjectHash: projectHash,
 		File:        filePath,
+		Deps:        make(whisk.KeyValueArr, 0),
 	}
-	ma, err := json.Marshal(m)
+	ma, err := structToJson(m)
 	if err != nil {
 		return managedAnnotation, err
 	}
-	var a interface{}
-	err = json.Unmarshal(ma, &a)
-	managedAnnotation = whisk.KeyValue{Key: MANAGED, Value: a.(map[string]interface{})}
+	managedAnnotation = whisk.KeyValue{Key: MANAGED, Value: ma}
 	return managedAnnotation, nil
 }
+
+func AddDependentAnnotation(existingAnnotation map[string]interface{}, dependencyAnnotations whisk.KeyValueArr) (whisk.KeyValue, error) {
+	managedAnnotation := whisk.KeyValue{}
+	m := ManagedAnnotation{
+		ProjectName: existingAnnotation[OW_PROJECT_NAME].(string),
+		ProjectHash: existingAnnotation[OW_PROJECT_HASH].(string),
+		File:        existingAnnotation[OW_File].(string),
+		Deps:        dependencyAnnotations,
+	}
+	ma, err := structToJson(m)
+	if err != nil {
+		return managedAnnotation, err
+	}
+	managedAnnotation = whisk.KeyValue{Key: MANAGED, Value: ma}
+	return managedAnnotation, nil
+}
+
+func structToJson(m ManagedAnnotation) (map[string]interface{}, error) {
+	ma, err := json.Marshal(m)
+	if err != nil {
+		return nil, err
+	}
+	var a interface{}
+	json.Unmarshal(ma, &a)
+	return a.(map[string]interface{}), nil
+}
diff --git a/wski18n/i18n_ids.go b/wski18n/i18n_ids.go
index 12807b5d..25ceb062 100644
--- a/wski18n/i18n_ids.go
+++ b/wski18n/i18n_ids.go
@@ -40,6 +40,7 @@ const (
 	CMD_DEPLOY         = "deploy"
 	CMD_UNDEPLOY       = "undeploy"
 	CMD_SYNC           = "sync"
+	TRIGGERS           = "Triggers"
 )
 
 // DO NOT TRANSLATE
@@ -72,6 +73,9 @@ const (
 	KEY_API             = "api"
 	KEY_URL             = "url"
 	KEY_PACKAGE         = "package"
+	KEY_BINDINGS        = "bindings"
+	KEY_DEPENDENCY      = "dependency"
+	KEY_LOCATION        = "location"
 )
 
 // DO NOT TRANSLATE
@@ -86,9 +90,11 @@ const (
 	// Cobra command descriptions
 	ID_CMD_DESC_LONG_REPORT   = "msg_cmd_desc_long_report"
 	ID_CMD_DESC_LONG_ROOT     = "msg_cmd_desc_long_root"
+	ID_CMD_DESC_LONG_SYNC     = "msg_cmd_desc_long_sync"
 	ID_CMD_DESC_SHORT_REPORT  = "msg_cmd_desc_short_report"
 	ID_CMD_DESC_SHORT_ROOT    = "msg_cmd_desc_short_root"
 	ID_CMD_DESC_SHORT_VERSION = "msg_cmd_desc_short_version"
+	ID_CMD_DESC_SHORT_SYNC    = "msg_cmd_desc_short_sync"
 
 	// Cobra Flag messages
 	ID_CMD_FLAG_API_HOST    = "msg_cmd_flag_api_host"
diff --git a/wski18n/i18n_resources.go b/wski18n/i18n_resources.go
index b22c9175..a28d6b9a 100644
--- a/wski18n/i18n_resources.go
+++ b/wski18n/i18n_resources.go
@@ -97,7 +97,7 @@ func wski18nResourcesDe_deAllJson() (*asset, error) {
 	return a, nil
 }
 
-var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5b\x5f\x8f\xdb\x36\x12\x7f\xcf\xa7\x18\x04\x07\xa4\x05\x1c\x25\xed\xe1\x80\x43\x80\x7d\xc8\x35\x69\xbb\xd7\x26\x1b\xec\x26\x17\x14\xb9\x85\x42\x8b\x63\x9b\xb5\x44\x0a\x24\x65\xc7\x35\xfc\xdd\x0f\xc3\x3f\x92\xec\x5d\x4a\x5a\xa7\xc5\xe5\xa5\x6e\x38\x9c\xf9\xcd\x90\xfc\x71\x66\xa8\x7c\x7a\x04\xb0\x7f\x04\x00\xf0\x58\xf0\xc7\x2f\xe0\x71\x65\x96\x79\xad\x71\x21\xbe\xe4\xa8\xb5\xd2\x8f\x67\x7e\xd4\x6a\x26\x4d\xc9\xac\x50\x92\xc4\x5e\xbb\xb1\x47\x00\x87\xd9\x80\x06\x21\x17\x2a\xa1\xe0\x92\x86\xc6\xe6\x9b\xa6\x28\xd0\x98\x84\x8a\x9b\x30\x3a\xa6\x65\xcb\xb4\x14\x72\x99\xd0\xf2\x31\x8c\x26\xb5\x14\x15\xcf\x39\x9a\x22\x2f\x95\x5c\xe6\x1a\x6b\xa5\x6d\x42\xd7\xb5\x1b\x34\xa0\x24\x70\xac\x4b\xb5\x43\x0e\x28\xad\xb0\x02\x0d\x7c\x23\x32\xcc\x66\xf0\x8e\x15\x6b\xb6\x44\x33\x83\x97\x05\xcd\x33\x33\x78\xaf\xc5\x72\x89\xda\xcc\xe0\xba\x29\x69\x04\x6d\x91\x7d\x0b\xcc\xc0\x16\xcb\x92\xfe\xab\xb1\x40\x69\xdd\x8c\x8d\xb3\x66\x40\x48\xb0\x2b\x04\x53\x63\x21\x16\x02\x39\x48\x56\xa1\xa9\x59\x81\xd9\x64\x5f\x94\x4a\x79\xf2\x12\xac\x52\x25\x58\x15\x1c\x99\x41\x23\xfd\x2f\x60\x92\x83\xd9\xc9\x02\x54\x8d\x72\xbb\x12\x66\x0d\x75\xf0\x09\x1a\x23\xe4\x12\x18\x54\x4c\x8a\x05\x1a\xeb\x84\x55\x4d\x5a\x59\x19\x54\x55\xe4\xc9\x42\x94\xad\xf8\x6f\x2f\xdf\xfc\x3a\x05\xb3\x59\x29\x6d\x87\x17\xe0\x9d\x56\x1b\xc1\xd1\x00\x03\xd3\x54\x15\xd3\x3b\xf0\xf2\xa0\x16\xb0\x5d\x31\xfb\xc4\xc0\x1c\xb1\xb7\x3c\x5f\x17\xc6\x00\x69\x34\x8e\x06\x2d\xc5\x72\x85\x65\x1d\x4c\xc3\x4e\x35\x7a\x52\x08\x29\x54\xd3\xb1\x6c\x50\x1b\xb2\x9d\x8a\x8f\x90\xd6\x39\x1c\xe4\x40\x36\xd5\x1c\xb5\x0b\x8f\x59\x7b\x68\xc3\xb6\x16\x25\x5b\xe6\xac\x16\xf9\x4a\x99\x94\xd7\xde\xa5\x97\xef\x2e\xe1\xf3\xcf\x57\x37\xef\x3f\x4f\xd4\x38\x8c\xbd\xa7\xf4\x3f\xaf\xaf\x6f\x2e\xaf\xde\x4e\xd2\xdb\xd8\x55\xbe\xc6\x5d\x42\x29\x0d\x2b\x2d\xfe\x70\x7f\x01\x9f\x7f\x79\xfd\xdb\x14\xa5\x05\x6a\x9b\xd3\xba\x24\xb4\xd6\xcc\xae\x28\xa4\x14\xe8\x8c\x84\xdd\x22\x4e\x51\xac\xe4\x42\xa4\x98\xca\x0f\x3a\x55\xf0\x0d\xc7\x05\x6b\x4a\x0b\xc2\xc0\xdf\x7e\xbe\x7a\xf3\xfa\x59\xb6\x35\xeb\x5a\xab\xda\x7c\x3b\x25\x2a\x65\xa9\xb6\x79\xd0\x91\xe2\x57\x27\x04\xad\xd0\xb8\xd6\xee\x7c\x0f\xc5\xa5\xe5\x94\x96\x08\x26\xa8\xae\x35\x6e\x04\x6e\x13\x7a\xcd\xca\x01\x8d\x4a\x9f\x45\xae\x72\x16\xea\x92\xc9\x09\x16\xd6\xb8\x9b\xbc\xa4\x6b\xdc\x4d\x05\xee\x23\x5d\x31\xc9\x96\xc8\x07\x03\x5d\x6b\xf5\x3b\x16\xb6\xbb\x30\xac\x82\x39\x42\xc5\xf4\x1a\x39\x44\x0d\x53\x42\xe5\xf4\xe4\x44\x64\x29\x67\x82\x29\x27\x32\xae\x31\x52\xd1\xc8\xaa\x1e\x31\xd6\x04\xb5\x2d\xd3\x26\xf4\x76\xe3\x93\x9d\x1e\x41\x68\x50\x6f\x50\x97\x68\x4c\x8c\xf6\x04\xd5\xc6\x6a\x91\xd4\xec\x97\xae\x31\xa8\xe9\xa0\x08\x89\x1c\x74\x23\xad\xa8\x5a\x86\x9d\x60\xc1\xea\x74\x10\xdc\x18\xa8\xc6\xd6\xcd\x14\xb0\x7e\xbb\x6d\x50\xcf\x95\x49\xa9\x0c\xa3\xe3\x4a\x1d\xdf\xe4\x95\x30\x74\x25\x39\x26\x4d\x13\xe9\xfb\x15\x02\x49\xd0\xee\x2d\x3c\x9b\xd2\x29\x11\x06\xa4\xb2\xe0\x55\x35\x1a\x79\xf6\xdf\xa1\x88\x9c\x58\xac\xc5\xc0\x25\x43\x16\xe9\x36\x20\x91\xaf\xb3\x33\xb6\x11\xc9\x52\x2b\x73\x9e\xa9\xe0\xca\x50\x46\x7c\xea\xcf\xa7\xfd\x3e\xa3\xdf\x87\xc3\xed\x0c\x16\x5a\x55\xb0\xdf\x67\x46\x35\xba\xc0\xc3\x61\x92\x4d\xbf\x60\x63\x36\x49\x2c\xae\x95\x41\x7b\x9e\xad\x36\x3c\x63\xd6\x8e\xe2\x48\x2e\xb6\x7f\x71\xbe\x9f\xb5\x58\x6e\x73\xe6\x8a\x81\xdc\xaa\x35\xca\x51\x97\x69\x06\xf8\x19\xe0\x66\x9c\xe7\x7c\x23\x2b\xa6\xcd\x8a\x95\x79\xa9\x0a\x56\x26\x2c\x7e\x88\x52\x70\x55\xa3\xfc\xe8\xd2\x98\x40\x12\xc6\xdb\x73\xb3\x61\xc3\xca\x06\xcd\x44\x83\x12\xed\x56\xe9\xf5\xd9\x26\x85\xb4\xa8\x25\x5a\x60\x96\xdc\x6d\x74\x39\xe2\x6b\x77\xa3\xe6\x05\x93\x05\x96\x65\xf2\x3e\xbb\xfa\x25\x83\x1f\xbc\x0c\xe5\xb2\xdd\xcc\xa9\x06\x16\x4c\xa4\xb5\xbf\xea\xae\x76\x2e\x78\x38\x8b\x55\x5d\xa2\x45\x30\x0d\x2d\xe9\xa2\x29\xcb\x5d\x06\xd7\x8d\x84\xcf\x6d\x56\xdb\x16\x30\x9f\xe9\x26\xd0\x58\xa9\x0d\x42\xcd\xb4\x15\xac\x2c\x77\x5d\x41\xc0\x8c\x41\x3b\xbc\x0a\x3d\xa4\xbe\xba\xc8\x8d\x65\xb6\x49\xe5\x51\x4f\x9f\x3e\x7d\x7a\x71\x71\x71\xd1\x5b\x8b\x9e\x0f\x37\x6e\x2a\x90\x00\x09\x4e\xb2\xea\xea\x62\xe4\x53\x42\x14\x43\xc3\x21\x14\xd3\x3e\x38\xc3\x9b\xec\xfc\xb5\xee\xcf\x9d\x6e\x64\x70\xbd\x3f\xf4\x93\xb9\xc1\x15\x9f\x6c\x6f\x2c\x7e\x47\x26\xcf\x88\x60\xa1\xaa\x8a\x49\x9e\xbb\x5a\xce\x65\x95\xc4\x72\x39\xb3\x39\x65\x22\x09\xa3\xfb\x7d\x56\x54\xfc\x70\x08\x15\xe0\x7e\x9f\xd1\x44\xbb\xab\xf1\x70\x70\x4c\x49\x73\x0f\x87\xdb\x2c\x1b\xb4\xed\xd2\xc7\x5d\x1e\xf7\xf3\x48\x0f\x65\xbf\xa7\x64\x36\x18\x20\x90\x87\xc3\x2d\xac\x58\xa8\x92\xfb\x0e\xb7\x27\x64\xba\xf5\x74\xd3\xe5\x55\x1c\x87\x7b\x01\x64\xd9\x40\xc1\x1b\x4c\xc4\x05\xfd\x33\x5d\xec\x74\x4e\x71\x32\x4a\xa7\xdd\xfc\xd0\x49\xdc\xeb\xe8\xa0\x9f\x1c\x6b\x94\x1c\x65\xf1\x90\x70\x76\x93\xce\xb7\xd3\x1d\x91\x64\x4c\x5f\xdd\x6b\xe6\x6b\x36\xce\xfd\x28\x88\x18\x1a\x9d\xca\xcb\x7a\x34\xa7\x16\x09\xd7\xff\x8f\x77\x44\xf4\xe7\x61\xfb\xe4\xeb\x56\xf0\x2e\xcd\xfd\x39\x6b\x38\xf1\x64\xa4\x90\x0c\xaf\xe3\x11\xdd\x9e\xb9\x92\x43\xa8\x42\xed\x7c\xee\x9d\xe3\x10\xf9\x1b\xa0\xad\xcd\x87\xb0\x00\x6f\x34\xad\x64\x30\xdb\xcf\x7f\xfe\xba\xfd\x16\x7d\x5c\xa8\x46\xf2\x3c\xe0\x0d\x4c\x95\xdc\x00\x25\xda\x24\x07\x6f\x57\xa2\x58\xc1\xd6\x35\x9f\x09\x17\xf7\x79\xa3\x5d\x21\x14\x8d\xd6\x14\x98\xe8\x60\x6c\x27\xb8\x4b\xca\xff\x26\x0d\xcc\x38\x5f\x28\x7e\x93\xd3\x82\xd0\x6d\xca\x43\x3b\x34\xd5\xc6\xf4\xa3\xae\x98\x80\x5e\x27\x4c\xa3\xab\xf0\xf9\x0c\x58\xd9\x4f\x7d\xdb\x65\x23\x1c\xba\x9d\x11\x8c\x00\xd3\xd8\xc6\xfa\x59\xb7\xd3\x81\x0b\x8d\x85\x0d\xbb\x5f\xfb\x8e\xed\x58\x7b\xf8\xf5\xf5\xf5\xd5\xf5\x4d\x02\xf7\xc5\xe9\x1f\xf0\xe2\x70\x67\xe0\xe2\x62\xe0\xfa\xd1\xfa\xf8\xa0\xad\xa5\xda\xca\x9c\x32\x85\xf1\xa3\x4e\x52\x14\xaa\x30\x2b\x83\xae\xef\x0b\x4a\x96\x3b\x30\x4d\xed\x1f\x31\x9e\xb9\x86\x6b\x66\x76\xc6\x62\x05\x73\x21\xb9\x90\x4b\x03\x4a\xc3\x52\xd8\x55\x33\xcf\x0a\x55\xb5\x6d\xeb\xe1\xfb\x52\xeb\x78\x67\x16\x1a\x99\x4d\xc1\x74\x8f\x4a\xe0\x44\x8e\xb6\xe5\x56\xd8\x15\xb8\xd7\x28\xa8\xd0\x18\xb6\xc4\x17\x34\x88\x5a\x1f\x0e\xee\x85\xc1\x8f\x15\x8a\xfb\x01\xfa\x31\x52\xcd\xf4\x20\xf9\xb3\x32\x08\x89\xdf\x39\x29\x7f\x11\xa4\x05\x22\xcf\x85\xdc\xa8\x75\x0a\xd0\x8f\x8e\xb6\x88\x2e\xbc\x98\x3b\x90\x34\x0d\xb6\x2b\xf7\xae\x11\x90\x5a\xff\xa6\x14\x86\xfe\x1a\xb4\x6b\xdc\xb5\x3d\x14\xca\x77\x99\x55\x7a\xa8\x3f\xd4\xca\xb8\x76\xc3\xa7\x18\xcc\x5b\xda\x8f\x41\xcf\xa8\xcd\xd8\x64\xcc\xa5\xb2\x9e\xec\x12\x06\xdf\xf4\xbb\x91\x8e\xab\x9d\x34\xd5\xbb\xae\x1d\xd8\xcf\xa8\xc7\x8c\xba\xec\xbd\x12\xa6\x62\xb6\x48\xa5\xef\xe4\x60\xbb\x3d\x68\x02\x77\x26\x78\xe4\x53\x21\x4f\xdb\xde\x7e\x3c\x60\x00\xae\xd0\x37\x96\x9c\x11\xb7\xac\x8e\xde\x48\xa8\xea\x29\x39\xea\xb2\xfa\xd1\xe8\xc6\xb0\x13\xa1\xfe\xa7\xed\xc5\x4a\x91\x0a\xdb\xa5\x1f\xa5\x63\x1e\x96\xa4\x6d\x68\x92\xad\xf0\x9b\xb0\x74\x4f\x66\x47\xa8\x94\x76\xd8\x99\x7b\xdc\x74\x73\xfc\xcf\x29\x71\x8e\x10\x47\x42\x7d\xfd\x10\x40\x27\x71\x75\x47\xc1\x23\x7a\x62\xc0\x77\x79\x7c\x28\xf1\x8b\x45\x69\x22\x68\xfc\xe2\xee\x30\x72\xe7\x6b\x5c\x31\xf9\x12\x53\x0d\xcc\xee\x28\x2f\xd1\x3f\xca\x05\xee\xed\x9a\xc8\xa1\x59\xd3\xdd\x64\x74\xbf\x89\xa2\x77\x7c\x27\xc7\xd4\x43\xcf\xbd\xc7\xee\xf4\xb4\xd6\x12\xf8\x8e\x1c\x76\x79\x21\x85\xb1\x8b\x32\x93\xbb\x76\x6f\x10\x89\xf4\x96\x7d\x34\xae\xa1\x89\xda\x42\x18\x75\xa3\xd1\xe5\xc3\x77\xae\x6f\x6c\x85\x12\xfa\xc3\xf5\xaf\x0e\x81\x6b\x75\xb9\xa3\xf4\xe9\xa8\xc6\xbe\xf5\x2f\xad\x53\x80\x54\xac\x5c\x28\x5d\x25\x23\xf7\x26\x8e\x0f\x21\xc8\xe0\xbd\xde\x01\x5b\x32\x21\xc7\x4a\x7a\xad\xf3\xdf\x8d\x92\x2d\xd9\x16\x15\x1f\x78\xd3\xfc\xf7\xcd\xd5\x5b\x10\xb2\x6e\x2c\x70\x66\x19\xbc\x09\xd1\x78\x52\x54\xfc\x09\x51\xef\xb0\x25\x56\x8b\xd6\xd0\x16\xe7\x61\xe3\xa4\xde\xb7\xef\x39\x1b\x71\x71\x19\x6c\x71\x1e\x76\xc4\xcc\xb5\xb6\x9d\x58\x2d\x48\xa6\x60\xd2\xe7\x1b\x73\xf4\x37\x3e\xf2\xd0\xf8\xe8\x26\x65\xf0\xae\x44\x66\x10\x9a\x9a\x33\x8b\x27\xd4\x67\x15\x14\x4a\x6e\x50\xdb\x13\xf3\x56\xf5\x75\x8c\x05\xb6\xef\xee\x59\xae\xc6\xcd\xe6\x4e\xea\x11\xc4\x49\x4e\xcf\x99\x41\x0e\x4a\xf6\x8f\xcf\x5d\x55\xa3\xa1\x10\xb2\x28\x1b\x8e\x27\xf0\x98\x39\x5a\x85\xf1\x60\x78\x92\x18\x3e\x68\xa9\x40\x84\x59\x19\x5c\x5a\x5f\x45\x2a\xbb\x72\x39\x85\x63\x87\x45\x23\x03\x37\x44\x02\x99\xf9\x58\x28\x89\xe1\x61\xb5\x22\x2d\xf8\xa5\xc6\x62\x0a\x23\x04\xac\x71\xed\x22\xcf\x11\xc1\xe7\x64\xf5\x2b\xd1\x3b\xe0\x1d\xd9\x91\x5a\xd5\xd8\x3e\xe9\x65\xf0\xb1\xbb\x4c\x22\xe5\xd1\xb4\x59\x4b\x8b\xb4\x3d\x62\xd2\x33\x72\x3d\x07\x77\x62\x98\x72\xaa\xba\x2c\xe6\x5c\xe8\x49\x64\x7d\xaf\x5b\xe4\x47\x1b\xf7\x5a\x09\xe9\x53\x43\x5f\x6a\x5a\x0c\x05\x0e\x25\x64\x1d\x2d\xcd\xa8\x94\x8d\x5e\x19\x57\x1b\x1d\x33\xf5\xb0\x1b\x05\x93\x36\x37\x6c\x83\x39\x57\xc5\x1a\x53\xdf\x8f\xfd\xc0\xa4\xd3\xca\x36\x08\xaf\x9c\x20\x88\xca\x15\x12\x23\x09\xb2\x28\x31\x67\xa5\x46\xc6\x77\x39\x7e\x11\x26\xf9\xf5\xc2\x8f\x74\x30\x82\x24\x78\xc9\x84\xee\x8f\x2f\xaf\xdf\x5e\xbe\xfd\x69\x7a\xd1\x16\x27\x3c\xac\x6c\xdb\x32\x2d\xdb\xce\xb0\x46\x9b\x4c\x95\xaf\x69\x8c\x16\xea\x53\x6c\x09\xdf\x02\x5b\x58\xd4\x3e\x4d\x7f\xe1\xef\x51\xba\xfc\x6f\x87\xce\x48\xb0\xe7\x9e\xc8\x1e\x7c\x73\xf6\xbf\x35\xe9\x65\xca\xc0\xd1\x8e\x9f\x4e\x67\x99\x8a\x03\x8e\xb5\xc6\x82\x68\x2e\xd7\x58\x97\xac\x48\x6e\x5f\xca\x9e\xc9\x8e\x2a\x79\xa8\x09\xdc\x8b\xa4\x67\xc5\xe3\x56\xf8\x56\x94\x25\x18\xa5\x24\xb1\x68\x67\x61\x06\x75\x60\x48\xe3\x8b\x22\xd7\xcc\xc0\xed\x91\x3a\x63\x91\x4d\xc4\x1e\x22\x71\x4e\x39\x63\x56\xaa\x29\x39\xc1\x33\x68\x33\xf8\x60\x7c\x5f\xcf\x37\x1d\xdc\x2b\x9f\x93\x76\xbf\xc6\x1b\xfa\x2d\x22\x27\x3f\xb2\x94\x84\xcb\x5b\xa0\xcc\xf5\x6e\x99\x45\x87\xce\xf3\xdc\x03\x4c\x3a\xfe\x61\x9b\xc1\xc5\x1b\x33\xea\xe6\xc7\x05\x8d\x0d\xa4\xf8\x11\x5a\xff\xeb\xb3\x71\x60\xa5\xa8\x84\xcd\xc5\x52\x2a\x9d\x84\x14\xb7\x74\x20\x67\x37\xc5\xa1\x72\xbf\x4e\x4b\x29\xa2\x7f\xaf\x6e\xaa\xf5\x62\xc5\xe4\x12\xd9\x3c\xf9\xbd\xd0\xaf\xad\xc5\xb6\x76\x33\xd1\xef\x72\xe7\x7b\x87\xad\x8e\x0c\x2e\xc9\x3c\xd5\xbf\x13\xf6\x82\x43\x60\xf2\x52\x2d\x73\x23\xfe\x48\x01\x28\xd5\xf2\x46\xfc\xe1\xae\x56\x3f\xe1\xc8\xe3\x6e\x8b\x32\xe9\xde\x82\x97\xa8\x61\x8e\x76\x8b\x28\xe1\xb9\xbb\xb0\xbf\x7b\x3e\x19\x4a\x85\x95\xd2\xbb\x21\x34\x5e\xe2\x5c\x40\xdf\x7d\xff\x4f\x07\xe9\x1f\xdf\x7d\x3f\x19\x13\xdd\xbf\xaa\x49\xd5\x5e\x61\xf4\x2c\x30\xcf\x7d\x7c\xfe\xfe\x9c\xfe\x8c\xe3\x71\x6d\xb4\xbc\xd6\xaa\x46\x6d\x05\xa6\xee\xab\xc8\x80\x3d\xbe\xf2\xcd\x57\xab\x05\xb6\xed\x57\xdf\x93\xeb\x94\xc5\x36\xed\xfd\x9c\x18\x29\x91\x2b\xb7\xe1\x88\x19\x85\x05\xd5\x58\x23\xb8\x5b\x88\xf7\x9a\x6d\x84\x81\x79\x23\x4a\x3e\xdc\xc3\x73\xae\x78\x3a\xd0\xb4\x6d\x27\x51\x41\xbb\xfb\x8f\x08\x41\x9e\x10\x7a\x88\xb6\xeb\x4c\xee\xf7\x59\xf8\xdb\x18\xee\xfd\x3e\xab\x84\x0c\x7d\x2a\xfa\x1f\x56\x8c\x54\xbd\x0e\x6a\x4c\x07\xfd\x21\x4b\xd1\x44\xec\x24\x04\x29\x4a\x8d\x4e\x9a\x0a\xf7\xa4\xe7\xc9\xbe\xc1\x59\xcd\x02\x87\x36\xb4\x22\x5d\x9f\x69\x30\xab\xb9\xd3\x65\x3a\xa2\x98\x93\x74\x27\xd6\x0c\x06\x4b\x2c\x28\x75\x55\x76\x85\xbe\x85\x3d\x0e\x29\x76\x76\x47\x1b\x6d\xe1\x2a\x3c\x69\x4a\xc5\x84\xa1\x50\xd2\x32\xf7\x5d\x9c\x54\xd3\xba\xc5\xce\x7a\xef\xa1\xc6\x05\x65\x0a\x88\x7b\x9f\x31\xc2\x8d\x73\xda\x7a\xdb\x86\x6e\x86\xef\x09\x06\xa1\xe3\x8a\x6b\x3c\x42\xbd\x0f\x2d\x73\xb5\x41\xad\x05\xe7\x98\x2a\x1f\x09\x61\xff\xbb\xcb\xee\xa1\xad\x9b\x1a\x73\x85\xfe\x3b\xca\xd4\x85\xca\x85\xc9\xeb\x66\x5e\x8a\x62\xa0\x9d\x13\x64\x63\xe5\xea\x3f\x2d\x65\x06\xfc\xc4\x3b\xed\xc5\x19\xd1\x85\xe3\x96\x39\xc2\x46\x18\x31\x2f\x7d\x31\x47\x85\x2c\xb1\xa3\x7b\x21\xa4\x22\x76\x47\x85\x91\x92\x89\x4f\x35\x5f\xbd\xfe\xd7\x87\x9f\x26\xa7\xd7\x4e\xfa\x61\xb9\x35\x9f\x2f\x73\x83\x4c\x17\x2b\x2a\x05\xe3\xc2\xb4\xe5\x4d\xea\x1f\x90\xc4\x19\xed\xc2\x1c\x17\x44\x71\x0f\xd3\xb9\xee\x08\x6c\xe4\x8a\x26\x28\xa7\xbb\xf7\xcf\xde\xb9\x67\xee\x5a\x82\xd6\x1e\x6b\xff\x50\x38\xf0\x4f\x17\x5e\xdd\xd3\xad\x0e\x11\x79\x01\x3f\x3a\x04\xdd\x3f\x5a\x70\x0f\x64\xa4\xec\xa1\x00\x86\x3f\xdc\x7d\x38\x86\xfe\x5b\x64\x7c\x3b\x0f\x90\x1e\xdd\x3e\xfa\x5f\x00\x00\x00\xff\xff\x03\x58\x3f\xe2\xef\x34\x00\x00")
+var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5b\x6d\x8f\xdb\x36\xf2\x7f\x9f\x4f\x31\x08\xfe\x40\x5a\xc0\x51\xd2\xfe\x71\xc0\x21\x40\x5e\xe4\x9a\xb4\xdd\x6b\x93\x0d\x76\xb3\x17\x14\xb9\x85\x42\x4b\x63\x9b\xb5\x44\x0a\x24\x65\xc7\x35\xfc\xdd\x0f\x33\xa4\x1e\xec\x5d\x4a\x5a\xa7\xbd\xeb\x9b\xf3\x2d\x87\x33\xbf\x79\xe0\x70\x66\xa8\x7c\x7a\x04\xb0\x7f\x04\x00\xf0\x58\xe6\x8f\x5f\xc0\xe3\xd2\x2e\xd3\xca\xe0\x42\x7e\x49\xd1\x18\x6d\x1e\xcf\xfc\xaa\x33\x42\xd9\x42\x38\xa9\x15\x91\xbd\xe1\xb5\x47\x00\x87\xd9\x00\x07\xa9\x16\x3a\xc2\xe0\x82\x96\xc6\xf6\xdb\x3a\xcb\xd0\xda\x08\x8b\xeb\xb0\x3a\xc6\x65\x2b\x8c\x92\x6a\x19\xe1\xf2\x31\xac\x46\xb9\x64\x65\x9e\xe6\x68\xb3\xb4\xd0\x6a\x99\x1a\xac\xb4\x71\x11\x5e\x57\xbc\x68\x41\x2b\xc8\xb1\x2a\xf4\x0e\x73\x40\xe5\xa4\x93\x68\xe1\x1b\x99\x60\x32\x83\xf7\x22\x5b\x8b\x25\xda\x19\xbc\xca\x68\x9f\x9d\xc1\x07\x23\x97\x4b\x34\x76\x06\x57\x75\x41\x2b\xe8\xb2\xe4\x5b\x10\x16\xb6\x58\x14\xf4\xbf\x06\x33\x54\x8e\x77\x6c\x58\x9a\x05\xa9\xc0\xad\x10\x6c\x85\x99\x5c\x48\xcc\x41\x89\x12\x6d\x25\x32\x4c\x26\xeb\xa2\x75\x4c\x93\x57\xe0\xb4\x2e\xc0\xe9\xa0\xc8\x0c\x6a\xe5\x7f\x81\x50\x39\xd8\x9d\xca\x40\x57\xa8\xb6\x2b\x69\xd7\x50\x05\x9d\xa0\xb6\x52\x2d\x41\x40\x29\x94\x5c\xa0\x75\x4c\xac\x2b\xe2\x2a\x8a\xc0\xaa\x24\x4d\x16\xb2\x68\xc9\x7f\x7b\xf5\xf6\xd7\x29\x98\xed\x4a\x1b\x37\xec\x80\xf7\x46\x6f\x64\x8e\x16\x04\xd8\xba\x2c\x85\xd9\x81\xa7\x07\xbd\x80\xed\x4a\xb8\x27\x16\xe6\x88\x3d\xf7\x7c\x9d\x19\x03\xa4\x51\x3b\x5a\x74\x64\xcb\x15\x16\x55\x10\x0d\x3b\x5d\x9b\x49\x26\x24\x53\x4d\xc7\xb2\x41\x63\x49\x76\xcc\x3e\x52\x39\x56\x38\xd0\x81\xaa\xcb\x39\x1a\x36\x8f\x5d\x7b\x68\x93\x65\x51\x14\x8c\xc6\x0f\x87\x0a\x2b\x7b\x59\xa1\xfa\x78\xac\xec\x1c\xdd\x96\xdc\x91\x15\x92\xa2\x82\x43\x0b\xcd\x06\xcd\xe4\x18\x9e\x8e\xa1\x17\x7d\x24\xa7\x89\x67\xfe\x83\x5e\xfc\x37\xa3\x79\x51\x88\x65\x2a\x2a\x99\xae\xb4\x8d\x05\x8e\x87\xf2\xea\xfd\x05\x7c\xfe\xf9\xf2\xfa\xc3\xe7\x89\x1c\x87\xdd\xdf\x63\xfa\xaf\x37\x57\xd7\x17\x97\xef\x26\xf1\xad\xdd\x2a\x5d\xe3\x2e\xc2\x94\x96\xb5\x91\x7f\xf0\x1f\xe0\xf3\x2f\x6f\x7e\x9b\xc2\x34\x43\xe3\x52\xb2\x5b\x84\x6b\x25\xdc\x8a\xdc\x42\xb1\x9a\x10\x31\x1b\x79\x0a\x63\xad\x16\x32\x96\xec\xfd\x22\xb3\x82\x6f\x72\x5c\x88\xba\x70\x20\x2d\xfc\xdf\xcf\x97\x6f\xdf\x3c\x4b\xb6\x76\x5d\x19\x5d\xd9\x6f\xa7\x58\xa5\x28\xf4\x36\x0d\x3c\x62\x57\x14\x13\x41\x4b\x34\xce\xb5\x0b\xaa\x21\xbb\xb4\x69\xb9\x8d\xbe\x09\xac\x2b\x83\x1b\x89\xdb\x08\x5f\xbb\x62\xa0\x0d\xd3\x67\x47\xc7\xa3\x2a\x84\x9a\x20\x61\x8d\xbb\xc9\x2e\x5d\xe3\x6e\x2a\x70\x6f\xe9\x52\x28\xb1\xc4\x7c\xd0\xd0\x95\xd1\xbf\x63\xe6\xba\x3b\xd7\x69\x98\x23\x94\xc2\xac\x31\x87\x86\xc3\x14\x53\x31\x9f\x94\xee\x82\x98\x32\x41\x14\x93\x8c\x73\x6c\x52\xc8\x88\x57\x8f\x92\xfe\x04\xb6\xed\x65\x15\xe1\xdb\xad\x4f\x56\x7a\x04\xa1\x4f\xcf\x05\x5a\xdb\x58\x7b\x02\x6b\xeb\x8c\x8c\x72\xf6\xae\xab\x2d\x1a\x3a\x28\x52\x61\x0e\xa6\x56\x4e\x96\xed\x25\x35\x41\x82\x33\x71\x23\xf0\x1a\xe8\xda\x55\xf5\x14\xb0\x3e\xdc\x36\x68\xe6\xda\xc6\x58\x86\xd5\x71\xa6\x9c\x6f\xd2\x52\x5a\xba\x1b\x38\x93\xc6\x13\xe9\x87\x15\x02\x51\x50\xf4\x66\x3e\x9b\xd2\x29\x91\x16\x94\x76\xe0\x59\xd5\x06\xf3\xe4\xdf\x43\x16\x39\x91\x58\xc9\x81\x4b\x86\x24\xd2\x6d\x40\x24\x5f\x27\x67\x2c\x10\x49\x52\x4b\x73\x9e\xa8\xa0\xca\x50\x53\x71\xaa\xcf\xa7\xfd\x3e\xa1\xdf\x87\xc3\xed\x0c\x16\x46\x97\xb0\xdf\x27\x56\xd7\x26\xc3\xc3\x61\x92\x4c\xef\xb0\x31\x99\x44\xd6\xf8\xca\xa2\x3b\x4f\x56\x6b\x9e\x31\x69\x47\x76\x24\x15\xdb\x3f\x9c\xaf\x67\x25\x97\xdb\x54\x70\x3f\x95\x3a\xbd\x46\x35\xaa\x32\xed\x00\xbf\x03\x78\xc7\x79\xca\xd7\xaa\x14\xc6\xae\x44\x91\x16\x3a\x13\x45\x44\xe2\x4d\x43\xd5\x2b\x22\x43\x92\xb0\x5e\x1e\xef\x86\x8d\x28\x6a\xb4\x13\x05\x2a\x74\x5b\x6d\xd6\x67\x8b\x94\xca\xa1\x51\xe8\x40\x38\x52\xb7\x36\xc5\x88\xae\xdd\x8d\x9a\x66\x42\x65\x58\x14\xd1\xfb\xec\xf2\x97\x04\x7e\xf0\x34\x54\x54\x76\x3b\xa7\x0a\x58\x08\x19\xe7\xfe\xba\xbb\xda\x73\x99\x87\xb3\x58\x56\x05\x3a\x04\x5b\x93\x4b\x17\x75\x51\xec\x12\xb8\xaa\x15\x7c\x6e\x1b\x83\xb6\x66\xfe\x4c\x37\x81\xc1\x52\x6f\x10\x2a\x61\x9c\x14\x45\xb1\xeb\x7a\x2a\x61\x2d\xba\x61\x2f\xf4\x90\xfa\x06\x2d\xb5\x4e\xb8\x3a\x56\x47\x3d\x7d\xfa\xf4\xe9\xcb\x97\x2f\x5f\xf6\x7c\xd1\xd3\xe1\x9a\xb7\x02\x11\x10\xe1\x24\xa9\x3c\x5a\xc0\x7c\x8a\x89\x1a\xd3\xe4\x10\xe6\x11\xde\x38\xc3\x41\x76\xbe\xaf\xfb\x7b\xa7\x0b\x19\xf4\xf7\x4d\xbf\x98\x1b\xf4\xf8\x64\x79\x63\xf6\x3b\x12\x79\x86\x05\x33\x5d\x96\x42\xe5\x29\x37\x55\x5c\x55\x52\x96\x4b\x85\x4b\xa9\x12\x89\x08\xdd\xef\x93\xac\xcc\x0f\x87\xd0\x8a\xed\xf7\x09\x6d\x74\xbb\x0a\x0f\x07\xce\x94\xb4\xf7\x70\xb8\x4d\x92\x41\xd9\x5c\x3e\xee\xd2\x26\x9e\x47\xc6\x50\xfb\x3d\x15\xb3\x41\x00\x81\x3c\x1c\x6e\x61\x25\xc2\xa0\xa1\xaf\x70\x7b\x42\xa6\x4b\x8f\xcf\xad\x5e\x37\xeb\x70\x2f\x80\x24\x19\x68\x42\x83\x88\xc6\xa1\x7f\xa6\x8a\x1d\xcf\x29\x4a\x36\xd4\x71\x35\x6f\x3a\x8a\x7b\x15\x1d\xd4\x33\xc7\x0a\x55\x8e\x2a\x7b\x88\x39\xbb\x4d\xe7\xcb\xe9\x8e\x48\xd4\xa6\xaf\xef\x15\xf3\x35\x81\x73\x3f\x0a\x4a\x0c\xb5\x89\xd5\x65\xaf\x8f\x66\x20\xf7\xab\xfe\x3f\xbc\x23\x1a\x7d\x1e\x16\x27\x5f\xe7\xc1\xbb\x69\xee\xcf\xf1\xe1\xc4\x93\x11\x43\x32\xec\xc7\x9b\x93\x69\xd6\x39\x9e\x1c\x42\x15\x7a\xe7\x73\xef\x1c\x46\xe4\x6f\x80\xb6\x37\x1f\xc2\x02\x79\x6d\xc8\x93\x41\x6c\xbf\xfe\xf9\xeb\xe2\xad\xd1\x71\xa1\x6b\x95\xa7\x01\x6f\xc8\x54\xd1\x00\x28\xd0\x45\x73\xf0\x76\x25\xb3\x15\x6c\x79\x7e\x4f\xb8\x72\x5f\x37\xba\x15\x42\x56\x1b\x43\x86\x69\x14\x6c\xc6\x09\x7c\x49\xf9\xdf\xc4\x41\x58\xd6\x85\xec\x37\xb9\x2c\x08\xd3\xa6\x34\x8c\x31\x63\x93\x60\xbf\xca\xcd\x04\xf4\x26\x61\x06\xb9\xc3\xcf\x67\x20\x8a\x7e\xe9\xdb\xba\x8d\x70\x98\x76\x47\x10\x02\xc2\x60\x6b\xeb\x67\x5d\xa4\x43\x2e\x0d\x66\x2e\x44\xbf\xf1\x73\xe0\xb1\x09\xfb\x9b\xab\xab\xcb\xab\xeb\x08\xee\x97\xa7\xff\x81\x27\x87\x3b\x0b\x2f\x5f\x0e\x5c\x3f\xc6\x1c\x1f\xb4\xb5\xd2\x5b\x95\x52\xa5\x30\x7e\xd4\x89\x8a\x4c\x15\x76\x25\xd0\x8d\xce\x41\xab\x62\x07\xb6\xae\xfc\x3b\xd0\x33\x1e\xb8\x26\x76\x67\x1d\x96\x30\x97\x2a\x97\x6a\x69\x41\x1b\x58\x4a\xb7\xaa\xe7\x49\xa6\xcb\x76\xdc\x3c\x7c\x5f\x1a\xd3\xdc\x99\x99\x41\xe1\x62\x30\xf9\x5d\x0e\x98\xe4\x28\x2c\xb7\xd2\xad\x80\x1f\xf4\xa0\x44\x6b\xc5\x12\x5f\xd0\x22\x1a\x73\x38\xf0\x58\xdb\xaf\x65\x3a\xf7\x0b\xf4\x63\xa4\x9b\xe9\x41\xf2\x67\x65\x10\x52\x7e\xe7\xa4\xfc\x45\x90\x16\x88\x79\x2a\xd5\x46\xaf\x63\x80\x7e\xe4\xb4\x45\xe9\xc2\x93\xf1\x81\xa4\x6d\xb0\x5d\xf1\xd3\x50\x40\xea\xfc\xb3\x5c\x58\xfa\x6b\xd0\xae\x71\xd7\xce\x50\xa8\xde\x15\x4e\x9b\xa1\xf9\x50\x4b\xc3\xe3\x86\x4f\x8d\x31\x6f\x29\x1e\x03\x9f\x51\x99\xcd\x90\x31\x55\xda\xf9\x64\x17\x11\xf8\xb6\x3f\x8d\xe4\x5c\xcd\xd4\xd4\xef\xf2\x38\xb0\x5f\x51\x8f\x09\xe5\xea\xbd\x94\xb6\x14\x2e\x8b\x95\xef\xa4\x60\x1b\x1e\xb4\x21\x67\x11\x79\x93\x4f\xa5\x3a\x1d\x7b\xfb\xf5\x80\x01\x72\x8d\x7e\xb0\xc4\x42\xd8\xad\x9c\xde\x88\xa8\xec\x31\x39\x9a\xb2\xfa\xd5\x46\x8d\x61\x25\x42\xff\x4f\xe1\x25\x0a\x19\x33\xdb\x85\x5f\xa5\x63\x1e\x5c\xd2\x0e\x34\x49\x56\xf8\x4d\x58\xba\x57\xc7\x23\x54\xda\x30\x76\xc1\xef\xc3\xbc\xc7\xff\x9c\x62\xe7\x06\xe2\x88\xa9\xaf\x1e\x02\xe8\xc4\xae\x7c\x14\x3c\xa2\x27\x16\xfc\x94\xc7\x9b\x12\xbf\x38\x54\xb6\x01\x8d\x5f\xf8\x0e\x23\x75\xbe\x46\x15\x9b\x2e\x31\x36\xc0\xec\x8e\xf2\x12\xfd\xbb\x66\xc8\xbd\xdd\x10\x39\x0c\x6b\xba\x9b\x8c\xee\x37\x99\xf5\x8e\xef\x64\x9b\x7a\xe8\xa9\xd7\x98\x4f\x4f\x2b\x2d\x82\xef\x48\x61\xae\x0b\xc9\x8c\x9d\x95\x85\xda\xb5\xb1\x41\x49\xa4\xe7\xf6\x51\xbb\x86\x21\x6a\x0b\x61\x54\x8d\xda\x14\x0f\x8f\x5c\x3f\xd8\x0a\x2d\xf4\xcd\xd5\xaf\x8c\x80\x47\x5d\x7c\x94\x3e\x1d\xf5\xd8\xb7\xfe\xb1\x7a\x0a\x90\x52\x14\x0b\x6d\xca\xa8\xe5\xde\x36\xeb\x43\x08\x12\xf8\x60\x76\x20\x96\x42\xaa\xb1\x96\xde\x98\xf4\x77\xab\x55\x9b\x6c\xb3\x32\x1f\x78\xd3\xfc\xe7\xf5\xe5\x3b\x90\xaa\xaa\x1d\xe4\xc2\x09\x78\x1b\xac\xf1\x24\x2b\xf3\x27\x94\x7a\x87\x25\x89\x4a\xb6\x82\xb6\x38\x0f\x81\x13\x7b\xa6\xbe\xe7\x6c\x34\xce\x15\xb0\xc5\x79\x88\x88\x19\x8f\xb6\x99\xac\x92\x44\x93\x09\xe5\xeb\x8d\x39\xfa\x1b\x1f\xf3\x30\xf8\xe8\x36\x25\xf0\xbe\x40\x61\x11\xea\x2a\x17\x0e\x4f\x52\x9f\xd3\x90\x69\xb5\x41\xe3\x4e\xc4\x3b\xdd\xe7\x31\x66\xd8\xbe\xba\x67\xa9\xda\x04\x1b\x9f\xd4\x23\x88\x93\x94\x9e\x0b\x8b\x39\x68\xd5\x3f\x3e\x77\x59\x8d\x9a\x42\xaa\xac\xa8\x73\x3c\x81\x27\xec\x91\x17\xc6\x8d\xe1\x93\xc4\xf0\x41\x8b\x19\x22\xec\x4a\xe0\xc2\xf9\x2e\x52\xbb\x15\xd7\x14\x9c\x1d\x16\xb5\x0a\xb9\xa1\x49\x20\x33\x6f\x0b\xad\x30\x3c\xac\x96\xc4\x05\xbf\x54\x98\x4d\xc9\x08\x01\x6b\xe3\xbb\x26\xcf\x51\x82\x4f\x49\xea\x57\xa2\x67\xe0\x5d\xb2\x23\xb6\xba\x76\xfd\xa4\x97\xc0\xc7\xee\x32\x69\x52\x1e\x6d\x9b\xb5\x69\x91\xc2\xa3\x29\x7a\x46\xae\xe7\xa0\x4e\x63\xa6\x94\xba\x2e\x87\x69\x2e\xcd\xa4\x64\x7d\xaf\x5a\xa4\x47\x6b\xf7\x4a\x4b\xe5\x4b\x43\xdf\x6a\x3a\x0c\x0d\x0e\x15\x64\x5d\x5a\x9a\x51\x2b\xdb\x68\x65\xb9\x37\x3a\xce\xd4\xc3\x6a\x64\x42\xb9\xd4\x8a\x0d\xa6\xb9\xce\xd6\x18\xfb\x04\xef\x07\xa1\x98\xab\xd8\x20\xbc\x66\x42\x90\x25\x37\x12\x23\x05\xb2\x2c\x30\x15\x85\x41\x91\xef\x52\xfc\x22\x6d\xf4\xeb\x85\x1f\xe9\x60\x04\x4a\xf0\x94\x11\xde\x1f\x5f\x5d\xbd\xbb\x78\xf7\xd3\xf4\xa6\xad\xd9\xf0\xb0\xb6\x6d\x2b\x8c\x6a\x27\xc3\x06\x5d\xb4\x54\xbe\xa2\x35\x72\xd4\xa7\x66\x24\x7c\x0b\x62\xe1\xd0\xf8\x32\xfd\x85\xbf\x47\xe9\xf2\xbf\x1d\x3a\x23\x41\x1e\x3f\x91\x3d\xf8\xe6\xec\x7f\x6b\xd2\xab\x94\x21\x47\x37\x7e\x3a\x59\x32\x35\x07\x39\x56\x06\x33\x4a\x73\xa9\xc1\xaa\x10\x59\x34\x7c\xa9\x7a\x26\x39\xba\xc8\x43\x4f\xc0\x2f\x92\x3e\x2b\x1e\x8f\xc2\xb7\xb2\x28\xc0\x6a\xad\x28\x8b\x76\x12\x66\x50\x85\x0c\x69\x7d\x53\xc4\xc3\x0c\xdc\x1e\xb1\xb3\x0e\xc5\x44\xec\xc1\x12\xe7\xb4\x33\x76\xa5\xeb\x22\x27\x78\x16\x5d\x02\x37\xd6\xcf\xf5\xfc\xd0\x81\x5f\xf9\x98\x9a\x7f\x8d\x0f\xf4\x5b\x44\x4c\x3f\xe2\x4a\xc2\xe5\x25\x50\xe5\x7a\xb7\xcd\xa2\x43\xe7\xf3\xdc\x03\x44\x72\xfe\x11\x9b\x41\xe7\x8d\x09\xe5\xfd\x8d\x43\x9b\x01\x52\xf3\x1d\x5f\xff\x03\xbe\x71\x60\x85\x2c\xa5\x4b\xe5\x52\x69\x13\x85\xd4\x84\x74\x48\xce\xbc\x85\x51\xf1\xaf\xd3\x56\x8a\xd2\xbf\x67\x37\x55\x7a\xb6\x12\x6a\x89\x62\x1e\xfd\x5e\xe8\xd7\x56\x62\xdb\xbb\xd9\x46\xef\x62\xe7\x67\x87\x2d\x8f\x04\x2e\x48\x3c\xf5\xbf\x13\x62\x81\x11\xd8\xb4\xd0\xcb\xd4\xca\x3f\x62\x00\x0a\xbd\xbc\x96\x7f\xf0\xd5\xea\x37\x1c\x69\xdc\x85\xa8\x50\xfc\x16\xbc\x44\xd3\x7e\xd0\xf8\x9c\x2f\xec\xef\x9e\x4f\x86\x52\x62\xa9\xcd\x6e\x08\x8d\xa7\x38\x17\xd0\x77\xdf\xff\x9d\x21\xfd\xed\xbb\xef\x27\x63\xa2\xfb\x57\xd7\xb1\xde\x2b\xac\x9e\x05\xe6\xb9\xb7\xcf\xff\x3f\xa7\xff\xc6\xf1\xf0\x18\x2d\xad\x8c\xae\xd0\x38\x89\xb1\xfb\xaa\xc9\x80\xbd\x7c\xe5\x87\xaf\xce\x48\x6c\xc7\xaf\x7e\x26\xd7\x31\x6b\xc6\xb4\xf7\xe7\xc4\x26\x25\xe6\x9a\x03\x8e\x32\xa3\x74\xa0\x6b\x67\x65\xce\x8e\xf8\x60\xc4\x46\x5a\x98\xd7\xb2\xc8\x87\x67\x78\xac\x8a\x4f\x07\x86\xc2\x76\x52\x2a\x68\xa3\xff\x28\x21\xa8\x93\x84\x1e\xac\xcd\x93\xc9\xfd\x3e\x09\x7f\x6d\xcc\xbd\xdf\x27\xa5\x54\x61\x4e\x45\xff\x47\x64\x23\x5d\x2f\x43\x6d\xca\x41\x7f\xc8\x62\x69\xa2\x99\x24\x04\x2a\x2a\x8d\x4e\x86\x0a\xf7\x94\xe7\xd1\xb9\xc1\x59\xc3\x02\x46\x1b\x46\x91\x3c\x67\x1a\xac\x6a\xee\x4c\x99\x8e\x52\xcc\x49\xb9\xd3\xf4\x0c\x16\x0b\xcc\xa8\x74\xd5\x6e\x85\x7e\x84\x3d\x0e\xa9\x99\xec\x8e\x0e\xda\xc2\x55\x78\x32\x94\x6a\x0a\x86\x4c\x2b\x27\xf8\xbb\x38\xa5\xa7\x4d\x8b\x59\x7a\xef\xa1\x86\x8d\x32\x05\xc4\xbd\xcf\x18\xe1\xc6\x39\x1d\xbd\x6d\xc3\x34\xc3\xcf\x04\x03\xd1\x71\xc7\x35\x6e\xa1\xde\x87\x96\xa9\xde\xa0\x31\x32\xcf\x31\xd6\x3e\x12\xc2\xfe\x77\x97\xdd\x43\x5b\xb7\xb5\xa9\x15\xfa\xef\x28\x53\x1d\x95\x4a\x9b\x56\xf5\xbc\x90\xb1\x2f\xca\xbd\x57\x98\xb6\xe9\x5c\xfd\xa7\xa5\xc2\x82\xdf\x78\x67\xbc\x38\xa3\x74\xc1\xb9\x65\x8e\xb0\x91\x56\xce\x0b\xdf\xcc\x51\x23\x4b\xd9\x91\x5f\x08\xa9\x89\xdd\x51\x63\xa4\x55\xe4\x53\xcd\xd7\x6f\xfe\x71\xf3\xd3\xe4\xf2\x9a\xa9\x1f\x56\x5b\xe7\xf3\x65\x6a\x51\x98\x6c\x45\xad\x60\xe3\x98\xb6\xbd\x89\xfd\x1b\x9c\x66\x47\xeb\x98\xe3\x86\xa8\x89\x61\x3a\xd7\x5d\x02\x1b\xb9\xa2\x09\xca\x69\xf4\xfe\xd9\x91\x7b\x66\xd4\x12\xb4\xf6\x58\xfb\x87\xc2\x81\x7f\xfd\xf1\xfa\x9e\x69\x75\xb0\xc8\x0b\xf8\x91\x11\x74\xff\xd8\x80\x1f\xc8\x88\xd9\x43\x01\x0c\x7f\xb8\xfb\x70\x0c\xfd\xb7\xc8\xe6\xed\x3c\x40\x7a\x74\xfb\xe8\x3f\x01\x00\x00\xff\xff\x9a\x8b\xa3\x0e\x32\x36\x00\x00")
 
 func wski18nResourcesEn_usAllJsonBytes() ([]byte, error) {
 	return bindataRead(
@@ -112,7 +112,7 @@ func wski18nResourcesEn_usAllJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 13551, mode: os.FileMode(420), modTime: time.Unix(1521501471, 0)}
+	info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 13874, mode: os.FileMode(420), modTime: time.Unix(1522158494, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -329,14 +329,14 @@ func AssetNames() []string {
 
 // _bindata is a table, holding each asset generator, mapped to its name.
 var _bindata = map[string]func() (*asset, error){
-	"wski18n/resources/de_DE.all.json":   wski18nResourcesDe_deAllJson,
-	"wski18n/resources/en_US.all.json":   wski18nResourcesEn_usAllJson,
-	"wski18n/resources/es_ES.all.json":   wski18nResourcesEs_esAllJson,
-	"wski18n/resources/fr_FR.all.json":   wski18nResourcesFr_frAllJson,
-	"wski18n/resources/it_IT.all.json":   wski18nResourcesIt_itAllJson,
-	"wski18n/resources/ja_JA.all.json":   wski18nResourcesJa_jaAllJson,
-	"wski18n/resources/ko_KR.all.json":   wski18nResourcesKo_krAllJson,
-	"wski18n/resources/pt_BR.all.json":   wski18nResourcesPt_brAllJson,
+	"wski18n/resources/de_DE.all.json": wski18nResourcesDe_deAllJson,
+	"wski18n/resources/en_US.all.json": wski18nResourcesEn_usAllJson,
+	"wski18n/resources/es_ES.all.json": wski18nResourcesEs_esAllJson,
+	"wski18n/resources/fr_FR.all.json": wski18nResourcesFr_frAllJson,
+	"wski18n/resources/it_IT.all.json": wski18nResourcesIt_itAllJson,
+	"wski18n/resources/ja_JA.all.json": wski18nResourcesJa_jaAllJson,
+	"wski18n/resources/ko_KR.all.json": wski18nResourcesKo_krAllJson,
+	"wski18n/resources/pt_BR.all.json": wski18nResourcesPt_brAllJson,
 	"wski18n/resources/zh_Hans.all.json": wski18nResourcesZh_hansAllJson,
 	"wski18n/resources/zh_Hant.all.json": wski18nResourcesZh_hantAllJson,
 }
@@ -380,18 +380,17 @@ type bintree struct {
 	Func     func() (*asset, error)
 	Children map[string]*bintree
 }
-
 var _bintree = &bintree{nil, map[string]*bintree{
 	"wski18n": &bintree{nil, map[string]*bintree{
 		"resources": &bintree{nil, map[string]*bintree{
-			"de_DE.all.json":   &bintree{wski18nResourcesDe_deAllJson, map[string]*bintree{}},
-			"en_US.all.json":   &bintree{wski18nResourcesEn_usAllJson, map[string]*bintree{}},
-			"es_ES.all.json":   &bintree{wski18nResourcesEs_esAllJson, map[string]*bintree{}},
-			"fr_FR.all.json":   &bintree{wski18nResourcesFr_frAllJson, map[string]*bintree{}},
-			"it_IT.all.json":   &bintree{wski18nResourcesIt_itAllJson, map[string]*bintree{}},
-			"ja_JA.all.json":   &bintree{wski18nResourcesJa_jaAllJson, map[string]*bintree{}},
-			"ko_KR.all.json":   &bintree{wski18nResourcesKo_krAllJson, map[string]*bintree{}},
-			"pt_BR.all.json":   &bintree{wski18nResourcesPt_brAllJson, map[string]*bintree{}},
+			"de_DE.all.json": &bintree{wski18nResourcesDe_deAllJson, map[string]*bintree{}},
+			"en_US.all.json": &bintree{wski18nResourcesEn_usAllJson, map[string]*bintree{}},
+			"es_ES.all.json": &bintree{wski18nResourcesEs_esAllJson, map[string]*bintree{}},
+			"fr_FR.all.json": &bintree{wski18nResourcesFr_frAllJson, map[string]*bintree{}},
+			"it_IT.all.json": &bintree{wski18nResourcesIt_itAllJson, map[string]*bintree{}},
+			"ja_JA.all.json": &bintree{wski18nResourcesJa_jaAllJson, map[string]*bintree{}},
+			"ko_KR.all.json": &bintree{wski18nResourcesKo_krAllJson, map[string]*bintree{}},
+			"pt_BR.all.json": &bintree{wski18nResourcesPt_brAllJson, map[string]*bintree{}},
 			"zh_Hans.all.json": &bintree{wski18nResourcesZh_hansAllJson, map[string]*bintree{}},
 			"zh_Hant.all.json": &bintree{wski18nResourcesZh_hantAllJson, map[string]*bintree{}},
 		}},
@@ -444,3 +443,4 @@ func _filePath(dir, name string) string {
 	cannonicalName := strings.Replace(name, "\\", "/", -1)
 	return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
 }
+
diff --git a/wski18n/resources/en_US.all.json b/wski18n/resources/en_US.all.json
index 512d7588..9824ddbc 100644
--- a/wski18n/resources/en_US.all.json
+++ b/wski18n/resources/en_US.all.json
@@ -35,6 +35,14 @@
     "id": "msg_cmd_desc_short_version",
     "translation": "Print the version number of wskdeploy"
   },
+  {
+    "id": "msg_cmd_desc_short_sync",
+    "translation": "A tool to sync your OpenWhisk packages between client and server."
+  },
+  {
+    "id": "msg_cmd_desc_long_sync",
+    "translation": "A tool to sync deployment and undeployment of openwhisk packages using a manifest and optional deployment files using YAML."
+  },
   {
     "id": "msg_cmd_flag_api_host",
     "translation": "whisk API `HOST`"


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services