## ---------------------------------------------------------------------------
## 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.
## ---------------------------------------------------------------------------

# Consumer properties

# No of simultaneous pull requests
consumer.concurrentConsumers=1

# Max number of messages per poll
consumer.maxMessagesPerPoll=10

# Pubsub service url. Defaults to google cloud default endpoint
# pubsub.serviceUrl=localhost:8383

pubsub.projectId=scg-bi-sandbox

# Google Pubsub topic
pubsub.topic=camel-google-pubsub-example
# Google Pubsub subscription
pubsub.subscription=camel-google-pubsub-example.sub


#credentials.fileLocation=
#credentials.account=test-account@camel-pubsub-component.iam.gserviceaccount.com
#credentials.key=-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCfCiEwLed3hJ+h\n3zkpsGZj+MEB8MbpbqdUsiAp+Ok05zchGHM8iEG5s4gh013CI0rnta4zYDTrB98p\nBD+BX0TFP4S1QecSK0RoaJ8OmLYgYN56olobbedPRRdZIwopvQ7wSIqrEwWtez6Y\nRXcQzykYzETDEc2s0JyJU9BI2ZAENPbMheZICUkLHJdX0FqVf5WTtRDXnyL79CiW\nRirqN+eJdhq46Dz/TlEymuMePZVWAdcx0v8xv102H9bqFWtJvin8pD6fIT6f2iL1\ne/lQjNUVvX7Sx2EuLWZlPo+mWNvRCTXZymTcluj0jleAYhjuMc2xVEDx2RaCt2sx\nCo2Nb0edAgMBAAECggEAIFEJn2WkhCfB3D2kuvDqTWQtq/xGHwbqH462dHDsymA1\nVpdGS0WQvXBauCzf/2P2g5DqXewttJh74zTGxr4aFk6q474JeyqpkuG3eFrVn0yv\nyJGW5730Y6oxbV5uYT7We0LyUoLiA3dop75tzE+cFTrkuhKzDWuyc0FBsJvs5L2e\nl/xJh7M8I6+9h+NlP9p90NujxSTIIYD/Ft7+KucG5q8ZlQksHnS6RavLPJ/lShmZ\nFmoGwJnNTwBSZnlz8txnWVjSDtTiqdrKrQVTeT8Vu8X0tw9lu49t9OsdrLkAVhHe\nyEF8WJmYlOhxIN8vgz6XYIUGzC1k00JB4fHTFaXygQKBgQD5HtUZL1ZtDDa+N/wx\npxQitmcI/ZkHHTIbRvy65XOAXBr4Ipa/eOHdrCZw7GAlj2zHIZJwIOg+6vfF2959\nirWBiwmLSvldMlGL6QaCWgqfhHJH8UIjeeYnmU1q6YBsFr1m8jDgzp/QLNpTKMjW\nvfN6cqJedRJiym1tTvtXjhip4QKBgQCjbnd3dLAYIOMsARKOj7rAjzDWVgFRIhOR\nUgPY+zCsgLp/ffKUqH2fhS9R6RAXosVeMBChn6kePVxxbVXjw18fGKdXgSjBXjQh\neyXjkKHe7gPT9MyuAk22tNpkAWcht5nR+mA8wLT23C0CYBblch7dDm+dc6QtLlHt\np4xuvHptPQKBgGBqAmdg3r4NgBJWcJB27WAR4Aamv1b1gbL04lMjAnSnMPjfyiAI\nlMHKIoaJtRxUSfE3mQk0cy4GmiZFVfKYgG7GdMcoGSJsmwrfANnqJzpddC1LviEk\nyGKC/mdmP4GVu2/gQ/J9hXR4J3cPzcrucRDu1NBh1t/NIFSxwKy+HeWBAoGATOoB\nKWPuN/zKTPxYOmWkM1lwV370cbWC1gJuMyDMYHLY0oV4s8O0E23/viHcY/NDxbcD\nLL1SPxwLtIoLQPzCeIUGxGTRxGdMS3GEfFumAp+rh4YPCdmlr1Xf7e7HFZQtvSeD\nQTRENmWafSKxw9v4cHqJxuUUn/rLrfgLXFYxm9UCgYEAwlPP5J4pr19rokKIoS00\nRLrIKipEmiQoo1ENP4efjuAFMMxLQnXnx1NusiVEHb5RUiHAEY5sm5OxyP1XN+RF\nch2BhWnx+4+quIsspNkc9qfQKS9Xvb/GulhRTS/NKQSBNjs+Qe80LxBcuHdFhf1y\nrskSCZARtDqGrfblLQo26Mg=\n-----END PRIVATE KEY-----

