pax_global_header00006660000000000000000000000064141531674570014527gustar00rootroot0000000000000052 comment=2342fee336a9107bc78a8aa4038b0edbf8211f18 prometheus-bird-exporter-1.2.6+ds/000077500000000000000000000000001415316745700171165ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/.github/000077500000000000000000000000001415316745700204565ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/.github/workflows/000077500000000000000000000000001415316745700225135ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/.github/workflows/release.yml000066400000000000000000000007371415316745700246650ustar00rootroot00000000000000on: push: tags: - '*.*.*' name: Release jobs: goreleaser: name: Create Release runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Set up Go uses: actions/setup-go@v2 with: go-version: 1.16 - name: Run GoReleaser uses: goreleaser/goreleaser-action@v2 with: args: release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} prometheus-bird-exporter-1.2.6+ds/.github/workflows/test.yml000066400000000000000000000010411415316745700242110ustar00rootroot00000000000000on: push: branches: - master pull_request: branches: - master name: Test jobs: test: strategy: matrix: go-version: [1.16.x] platform: [ubuntu-latest] runs-on: ${{ matrix.platform }} steps: - name: Install Go if: success() uses: actions/setup-go@v2 with: go-version: ${{ matrix.go-version }} - name: Checkout code uses: actions/checkout@v2 - name: Build run: go build - name: Run tests run: go test ./... -v -covermode=count prometheus-bird-exporter-1.2.6+ds/.gitignore000066400000000000000000000000321415316745700211010ustar00rootroot00000000000000.idea *.iml bird_exporter prometheus-bird-exporter-1.2.6+ds/.goreleaser.yml000066400000000000000000000004741415316745700220540ustar00rootroot00000000000000dist: artifacts before: hooks: - go mod download builds: - env: - CGO_ENABLED=0 goos: - linux - darwin - freebsd goarch: - amd64 - arm - arm64 ignore: - goos: freebsd goarch: arm64 ldflags: -s -w -X main.version={{.Version}} binary: bird_exporter prometheus-bird-exporter-1.2.6+ds/Dockerfile000066400000000000000000000005071415316745700211120ustar00rootroot00000000000000FROM golang as builder ADD . /go/bird_exporter/ WORKDIR /go/bird_exporter RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o /go/bin/bird_exporter FROM alpine:latest RUN apk --no-cache add ca-certificates bash WORKDIR /app COPY --from=builder /go/bin/bird_exporter . EXPOSE 9324 ENTRYPOINT ["/app/bird_exporter"] prometheus-bird-exporter-1.2.6+ds/LICENSE000066400000000000000000000020601415316745700201210ustar00rootroot00000000000000MIT License Copyright (c) 2016 Daniel Czerwonk Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. prometheus-bird-exporter-1.2.6+ds/README.md000066400000000000000000000067401415316745700204040ustar00rootroot00000000000000# bird_exporter [![Go Report Card](https://goreportcard.com/badge/github.com/czerwonk/bird_exporter)](https://goreportcard.com/report/github.com/czerwonk/bird_exporter) Metric exporter for bird routing daemon to use with Prometheus ## Remarks Since bird_exporter uses the bird unix sockets, bird has to be installed on the same maschine as bird_exporter. Also the user executing bird_exporter must have permission to access the bird socket files. ### Bird configuration To get meaningful uptime information bird has to be configured this way: ``` timeformat protocol iso long; ``` ## Important information for users of bird 2.0+ Version 2.0 of bird routing daemon does support IPv4 and IPv6 in one single daemon now. For further information see [here](https://gitlab.labs.nic.cz/labs/bird/wikis/transition-notes-to-bird-2). Since version 1.1 bird_exporter can be used with bird 2.0+ using the `-bird.v2` parameter. When using this parameter bird_exporter queries the same bird socket for IPv4 and IPv6. In this mode the IP protocol is determined by the channel information and parameters `-bird.ipv4`, `-bird.ipv6` and `-bird.socket6` are ignored. ## Metric formats In version 1.0 a new metric format was introduced. To prevent a breaking change the new format is optional and can be enabled by using the ```-format.new``` flag. The new format handles protocols more generic and allows a better query structure. Also it adheres more to the metric naming best practices. In both formats protocol specific metrics are prefixed with the protocol name (e.g. OSPF running metric). This is a short example of the different formats: ### old format ``` bgp4_session_prefix_count_import{name="bgp1"} 600000 bgp6_session_prefix_count_import{name="bgp1"} 50000 ospfv3_running{name="ospf1"} 1 ``` ### new format ``` bird_protocol_prefix_import_count{name="bgp1",proto="BGP",ip_version="4"} 600000 bird_protocol_prefix_import_count{name="bgp1",proto="BGP",ip_version="6"} 50000 bird_ospfv3_running{name="ospf1"} 1 ``` ### Default Port In version 0.7.1 the default port changed to 9324 since port 9200 is the default port of elasticsearch. The new port is now registered in the default port allocation list (https://github.com/prometheus/prometheus/wiki/Default-port-allocations) ### Sockets In version 0.8 communication to bird changed to sockets. The default socket path is ```/var/run/bird.ctl``` (for bird) and ```/var/run/bird6.ctl``` (for bird6). In case you are using different paths in your installation, the socket path can be specified by usind the ```-bird.socket``` (for bird) and ```-bird.socket6``` (for bird6) flag. ## Install ``` go get -u github.com/czerwonk/bird_exporter ``` ## Usage ``` bird_exporter -format.new=true ``` ## BIRD RS Dashboard this sample dashboard was created by [openbsod](https://github.com/openbsod). Thanks for contributing! https://grafana.com/dashboards/5259 ![alt text](https://github.com/czerwonk/bird_exporter/blob/master/grafana/img/bird_exporter.png) ## Features * BGP session state * OSPF neighbor/interface count * imported / exported / filtered prefix counts / route state changes (BGP, OSPF, Kernel, Static, Device, Direct) * protocol uptimes (BGP, OSPF) ## Third Party Components This software uses components of the following projects * Prometheus Go client library (https://github.com/prometheus/client_golang) ## License (c) Daniel Czerwonk, 2016. Licensed under [MIT](LICENSE) license. ## Prometheus see https://prometheus.io/ ## Bird routing daemon see http://bird.network.cz/ prometheus-bird-exporter-1.2.6+ds/bird_exporter.1.md000066400000000000000000000061251415316745700224530ustar00rootroot00000000000000--- date: 2018-06-20 footer: bird_exporter header: "bird_exporter's Manual" layout: page license: "Licensed under the MIT license" section: 1 title: BIRD_EXPORTER --- # NAME bird_exporter - A protocol state exporter for the BIRD routing daemon to use with Prometheus # SYNOPSIS **bird_exporter** [**OPTIONS**] # DESCRIPTION **bird_exporter** is a metric exporter for the BIRD routing daemon to use with Prometheus. Since **bird_exporter** uses the BIRD Unix socket(s), BIRD needs to be installed on the same machine as bird_exporter. The user executing bird_exporter must have read/write permission to access the BIRD Unix sockets. # OPTIONS **-bird.ipv4** Get protocols from bird (not compatible with **-bird.v2**) **-bird.ipv6** Get protocols from bird6 (not compatible with **-bird.v2**) **-bird.socket** */path/to/socket* Socket to communicate with bird routing daemon **-bird.socket6** */path/to/socket* Socket to communicate with bird6 routing daemon (not compatible with **-bird.v2**) **-bird.v2** BIRD major version >= 2.0 (multi channel protocols) **-format.new** New metric format (more convenient / generic) **-proto.bgp** Enables metrics for protocol BGP **-proto.direct** Enables metrics for protocol Direct **-proto.kernel** Enables metrics for protocol Kernel **-proto.ospf** Enables metrics for protocol OSPF **-proto.static** Enables metrics for protocol Static **-version** Print version information **-web.listen-address** *[address]:port* Address on which to expose metrics and web interface **-web.telemetry-path** *path* Path under which to expose metrics (default "/metrics") Version 2.0 of BIRD supports both IPv4 and IPv6 in a single daemon. Since version 1.1 of **bird_exporter**, it can be used with BIRD 2.0+ using the **-bird.v2** option. When using this option, **bird_exporter** queries the same socket for both IPv4 and IPv6. In this mode the IP protocol is determined by the channel information, and options **-bird.ipv4**, **-bird.ipv6** and **-bird.socket6** are ignored. # BIRD CONFIGURATION To get meaningful uptime information, BIRD needs to be configured to use ISO-format timestamps: ``` timeformat protocol iso long; ``` # METRIC FORMATS In version 1.0, a new metric format was introduced. To avoid backwards incompatibility, the new format is optional and can be enabled by using the **-format.new** option. The new format handles protocols more generically and allows for a better query structure. It also adheres more to the Prometheus metric naming best practices. In both formats protocol specific metrics are prefixed with the protocol name (e.g. OSPF running metric). ## OLD METRIC FORMAT EXAMPLE ``` bgp4_session_prefix_count_import{name="bgp1"} 600000 bgp6_session_prefix_count_import{name="bgp1"} 50000 ospfv3_running{name="ospf1"} 1 ``` ## NEW METRIC FORMAT EXAMPLE ``` bird_protocol_prefix_import_count{name="bgp1",proto="BGP",ip_version="4"} 600000 bird_protocol_prefix_import_count{name="bgp1",proto="BGP",ip_version="6"} 50000 bird_ospfv3_running{name="ospf1"} 1 ``` # AUTHOR Daniel Czerwonk prometheus-bird-exporter-1.2.6+ds/client/000077500000000000000000000000001415316745700203745ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/client/bird_client.go000066400000000000000000000040421415316745700232010ustar00rootroot00000000000000package client import ( "fmt" "github.com/czerwonk/bird_exporter/parser" "github.com/czerwonk/bird_exporter/protocol" birdsocket "github.com/czerwonk/bird_socket" ) // BirdClient communicates with the bird socket to retrieve information type BirdClient struct { Options *BirdClientOptions } // BirdClientOptions defines options to connect to bird type BirdClientOptions struct { BirdV2 bool BirdEnabled bool Bird6Enabled bool BirdSocket string Bird6Socket string } // GetProtocols retrieves protocol information and statistics from bird func (c *BirdClient) GetProtocols() ([]*protocol.Protocol, error) { ipVersions := make([]string, 0) if c.Options.BirdV2 { ipVersions = append(ipVersions, "") } else { if c.Options.BirdEnabled { ipVersions = append(ipVersions, "4") } if c.Options.Bird6Enabled { ipVersions = append(ipVersions, "6") } } return c.protocolsFromBird(ipVersions) } // GetOSPFAreas retrieves OSPF specific information from bird func (c *BirdClient) GetOSPFAreas(protocol *protocol.Protocol) ([]*protocol.OspfArea, error) { sock := c.socketFor(protocol.IPVersion) b, err := birdsocket.Query(sock, fmt.Sprintf("show ospf %s", protocol.Name)) if err != nil { return nil, err } return parser.ParseOspf(b), nil } func (c *BirdClient) protocolsFromBird(ipVersions []string) ([]*protocol.Protocol, error) { protocols := make([]*protocol.Protocol, 0) for _, ipVersion := range ipVersions { sock := c.socketFor(ipVersion) s, err := c.protocolsFromSocket(sock, ipVersion) if err != nil { return nil, err } protocols = append(protocols, s...) } return protocols, nil } func (c *BirdClient) protocolsFromSocket(socketPath string, ipVersion string) ([]*protocol.Protocol, error) { b, err := birdsocket.Query(socketPath, "show protocols all") if err != nil { return nil, err } return parser.ParseProtocols(b, ipVersion), nil } func (c *BirdClient) socketFor(ipVersion string) string { if !c.Options.BirdV2 && ipVersion == "6" { return c.Options.Bird6Socket } return c.Options.BirdSocket } prometheus-bird-exporter-1.2.6+ds/client/client.go000066400000000000000000000006311415316745700222010ustar00rootroot00000000000000package client import "github.com/czerwonk/bird_exporter/protocol" // Client retrieves information from Bird routing daemon type Client interface { // GetProtocols retrieves protocol information and statistics from bird GetProtocols() ([]*protocol.Protocol, error) // GetOSPFAreas retrieves OSPF specific information from bird GetOSPFAreas(protocol *protocol.Protocol) ([]*protocol.OspfArea, error) } prometheus-bird-exporter-1.2.6+ds/examples/000077500000000000000000000000001415316745700207345ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/examples/kubernetes/000077500000000000000000000000001415316745700231035ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/examples/kubernetes/daemonset.yaml000066400000000000000000000016451415316745700257540ustar00rootroot00000000000000apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: bird-exporter namespace: kube-system labels: app: bird-exporter spec: updateStrategy: type: RollingUpdate template: metadata: labels: app: bird-exporter spec: tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: bird-exporter image: bird_exporter:latest args: ["-format.new=true", "-bird.socket=/var/run/bird/bird.ctl"] resources: limits: cpu: 100m memory: 32Mi requests: cpu: 100m memory: 32Mi volumeMounts: - mountPath: /var/run/bird/ name: bird-socket readOnly: true ports: - containerPort: 9324 name: metrics volumes: - name: bird-socket hostPath: path: /var/run/bird/ prometheus-bird-exporter-1.2.6+ds/go.mod000066400000000000000000000005071415316745700202260ustar00rootroot00000000000000module github.com/czerwonk/bird_exporter go 1.16 require ( github.com/czerwonk/bird_socket v0.0.0-20190111125930-6c39d61f8853 github.com/czerwonk/testutils v0.0.0-20170526233935-dd9dabe360d4 github.com/prometheus/client_golang v1.11.0 github.com/prometheus/common v0.29.0 // indirect github.com/sirupsen/logrus v1.6.0 ) prometheus-bird-exporter-1.2.6+ds/go.sum000066400000000000000000001330201415316745700202500ustar00rootroot00000000000000cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/czerwonk/bird_socket v0.0.0-20190111125930-6c39d61f8853 h1:XSnDYYRExBUBKn2K2fWE5Z4rYPkdsjBwN7SvU5CACzM= github.com/czerwonk/bird_socket v0.0.0-20190111125930-6c39d61f8853/go.mod h1:SQ2xpIC3W7ygMomUYEsxXBeun7RML/HCNXj24fbz+XI= github.com/czerwonk/testutils v0.0.0-20170526233935-dd9dabe360d4 h1:1QQjuJMb2LVM/sk4HS7svnGjM8um7EWk8lD5BwZ2X28= github.com/czerwonk/testutils v0.0.0-20170526233935-dd9dabe360d4/go.mod h1:Xibh2UDW2TbNjbi8QON4p0QxiYK/RM5USagAW7J3jUM= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0 h1:3jqPBvKT4OHAbje2Ql7KeaaSicDBCxMYwEJU1zRJceE= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 h1:JWgyZ1qgdTaF3N3oxC+MdTV7qvEEgHo3otj+HB5CM7Q= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1 h1:7QnIQpGRHE5RnLKnESfDoxm2dTapTZua5a0kS0A+VXQ= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= prometheus-bird-exporter-1.2.6+ds/grafana/000077500000000000000000000000001415316745700205155ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/grafana/BIRD-RS-1522082867844.json000066400000000000000000000152161415316745700240050ustar00rootroot00000000000000{ "__inputs": [ { "name": "DS_PROMETHEUS", "label": "Prometheus", "description": "", "type": "datasource", "pluginId": "prometheus", "pluginName": "Prometheus" } ], "__requires": [ { "type": "grafana", "id": "grafana", "name": "Grafana", "version": "4.6.3" }, { "type": "panel", "id": "graph", "name": "Graph", "version": "" }, { "type": "datasource", "id": "prometheus", "name": "Prometheus", "version": "1.0.0" } ], "annotations": { "list": [ { "builtIn": 1, "datasource": "-- Grafana --", "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "type": "dashboard" } ] }, "editable": true, "gnetId": null, "graphTooltip": 1, "hideControls": true, "id": null, "links": [], "rows": [ { "collapse": false, "height": 509, "panels": [ { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": "${DS_PROMETHEUS}", "fill": 0, "id": 2, "legend": { "alignAsTable": true, "avg": false, "current": true, "hideEmpty": true, "hideZero": true, "max": false, "min": false, "rightSide": true, "show": true, "sort": "current", "sortDesc": true, "total": false, "values": true }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "null", "percentage": false, "pointradius": 1, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "span": 12, "stack": false, "steppedLine": true, "targets": [ { "dateTimeType": "DATETIME", "expr": "bird_protocol_prefix_export_count{ip_version=\"4\",proto=\"BGP\"}", "format": "time_series", "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", "intervalFactor": 1, "legendFormat": "{{name}}", "query": "SELECT\n $timeSeries as t,\n count()\nFROM $table\nWHERE $timeFilter\nGROUP BY t\nORDER BY t", "refId": "A", "round": "0s" } ], "thresholds": [], "timeFrom": null, "timeShift": null, "title": "PITER-IX prefixes exported", "tooltip": { "shared": true, "sort": 2, "value_type": "individual" }, "transparent": true, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": "", "logBase": 1, "max": null, "min": null, "show": false }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": false } ] }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": "${DS_PROMETHEUS}", "fill": 0, "id": 3, "legend": { "alignAsTable": true, "avg": false, "current": true, "hideEmpty": true, "hideZero": true, "max": false, "min": false, "rightSide": true, "show": true, "sort": "current", "sortDesc": true, "total": false, "values": true }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "null", "percentage": false, "pointradius": 5, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "span": 12, "stack": false, "steppedLine": true, "targets": [ { "dateTimeType": "DATETIME", "expr": "bird_protocol_prefix_import_count{ip_version=\"4\",proto=\"BGP\"}", "format": "time_series", "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", "intervalFactor": 1, "legendFormat": "{{name}}", "query": "SELECT\n $timeSeries as t,\n count()\nFROM $table\nWHERE $timeFilter\nGROUP BY t\nORDER BY t", "refId": "A", "round": "0s" } ], "thresholds": [], "timeFrom": null, "timeShift": null, "title": "PITER-IX prefixes imported", "tooltip": { "shared": true, "sort": 2, "value_type": "individual" }, "transparent": true, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "none", "label": "prefixes", "logBase": 1, "max": null, "min": null, "show": false }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": false } ] } ], "repeat": null, "repeatIteration": null, "repeatRowId": null, "showTitle": false, "title": "Dashboard Row", "titleSize": "h6" } ], "schemaVersion": 14, "style": "dark", "tags": [], "templating": { "list": [] }, "time": { "from": "now-30m", "to": "now" }, "timepicker": { "refresh_intervals": [ "5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d" ], "time_options": [ "5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d" ] }, "timezone": "", "title": "BIRD RS", "version": 15 }prometheus-bird-exporter-1.2.6+ds/grafana/img/000077500000000000000000000000001415316745700212715ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/grafana/img/bird_exporter.png000066400000000000000000002737161415316745700246670ustar00rootroot00000000000000‰PNG  IHDRdÊK'êÔsBIT|dˆ IDATxœìÝwxTUâÆñï–ž!¡…Ф"*º*‚ ÅŸ ¢îZV *ŠRlè *`ï`¥è® X@pë (Š"Š‚Ò“@(!=™L»÷÷Gd0¤ÞÖ}?ÏŸÌÜ{î9÷̉Ì{Ï9ƱÇkq€òóó)..Æ4M|>@Ó4 …B˜¦‰ÃáÀétâp8p»ÝDEEáp8HLL$11ñ@«Øš5k8ꨣ¬~9tÖ¬YÃGÑÐÍ‘ÿ1®)\\\Lnn.Á`ÒÒR@•û™¦‰išø|>Š‹‹q»Ý HNN&66ö@š""""""""""""""r؉(5M“íÛ· )..®6ˆ­I  ??·ÛM(ÂívÓ¢E G$M9ìØN?ý~?™™™x½^òóók c“ÜÞï›ÎùiñUnßÌ–––’••…ßï·Û$‘Ã’­@Öï÷“Mii)ÅÅÅXVÍËÏ&¹|yn;z7‹åõSÓª e-Ë¢¸¸˜’’²³³ÊŠˆˆˆˆˆˆˆˆˆˆˆˆÈŸBÙ½alII eeeu*óPÏf¤Ç»÷=>®Yû—••)”‘?:¯!»}ûv>Ÿ¯Ö}“Ü.mŸTiDlz¼›­ƒ;²tg)ïg‘ç¦O³8º7Ž¢Í¼õø|>Ün7;vì ==Ýæéˆˆˆˆˆˆˆˆˆˆˆˆˆˆ>êÈnß¾€’’’ðsInç¥Å“ç¦M¼‡­Å~~Êóѽq#»4!Éã¬òXI'ç·NàüÖ žïËÒ]¥ázÜn7{öì!999¢ihµ²>Ÿ¿ß_iÍØ]š0¡{ÓziÔÞ5e’’’p¹êøÒ¥üsS‹²Š(˜áç“ÜÎOKà²öIôn Àeí“Â#d¦i²sçNZµje»n‘†Vc   …B”––VÚ–Q\}@[àqù¶UX+l˜üssÿÜ\@ïÔX^?µ—µO"£$À”ŸrÂûy½^ èë¹R.—‹“O>Ó49餓X¾|9;w&11‘Ï>ûŒââb6oÞÌqÇGŸ>}øüóÏéÝ»7~¿ŸU«Vqê©§òá‡òóÏ?7ô©ˆˆˆˆˆˆˆˆˆˆˆˆˆH=qÔ´qÏž=8Î*GÇV¶úCôÿ8£ÚíUçè÷6òS^º7%=ÎÞæ÷ûq8ìÞ½»NÇ:”ºuëF£F>|8ÅÅÅôêÕ‹ÓN;72räH.¼ðB’’’=z4;vì`È!tëÖ¬¬,F…aœzê©téÒ¥¡OElr;ÍÚwj ZsYDDDDDDDDDDDäðRc [RR‚ßï¯r[FI€EÛ ÁeUø™òs?åûª,“çâ”f1¤ÇU˜[0éÿqf ÇT ”ü~•#tšËåbÈ!,[¶Œ¸¸8Ž:ê(æÎKÿþýÙ¹s'ÙÙÙ4mڔŋÓ½{wš4iÂÂ… ¹ä’Køé§Ÿ(--åä“O®°.¯þ ,æ]³…cÒæšôx<´nÝšÖéé$$$TÚ>ã…¹ì²ËY{ ÃÀívWûÓК4iBjjjC7CDDDDDDDDDDDþ ÄÇÇÓ´iS\®ZW}µ¥Æ£…B¡׎}þ×<ú~œQàùµy•ö»¬cŽK¦M¾€fkQ€×+dúÏùøM &#¿ÊæùÓš1rÙ¾²@à°œ¶¸sçÎá0¶{÷îÌ;—°sçNÖ­[Ç€X´hÝ»w'99™ „ÃØ²²2N>ùdæÎ[ë Ú¯_?†~ì÷ûÉÍÍeõêÕ¼óÎ;…÷8p £Fª²œ×ë%##ƒÅ‹³råÊŸ““Ã?üÀûï¿OAA­öUWËåâ¼óΣOŸ>4mÚ¯×Kvv6~ø!ß|óMuNÎéZD›&~FõÉấҺ{öìÉ-·Ž¡¤¤˜¬¬,fÍšEQQ±±±ÄÇÇãt:q: ¹äbãâxéÅê½MÏ<û-[¶¬vû®]»xù¥—øæ›õÞ–ý¥¤¤ð‹/0~ü8~ûõ×CÞùsKOoÃŽÙÕn“ºq»Ý´hÑ’ŒŒ­‡¤>—ËÅ™}ûrÆg’––@VVŸ~ú Ÿ}ú)Á`ð´Cn·› 䬳Φyóæ@y>ùË/¿ðî»ïðêUtér$%ñõ×_GTGi ÓéÄç«z´+@Ÿ´ ϾžÏUÆN?3•˺$þþhß¾m“]ÜurtŒcÄ';ùiŸE[KXSà£{²‡Ÿö”x™¦‰ÃQã@Þ±råJú÷ïO÷îÝyë­·¸à‚ صkW8Œ}÷ÝwIII!99¹ÂÈØ²²2N:é$æÎKß¾}ÉÏϯµ®¢¢"î¿ÿ~¢££iÓ¦ ƒ¦M›6Lš4©Ær“'OÆáp˜˜HïÞ½¹å–[xàX»vmÇ?çœsèÕ«S¦L!33³ÖöÕVÏe—]F¯^½xóÍ7ÉÌÌ$..ŽÎ;ãt:k=ÿÇňÞ9Üó~ n뻋­¼¬ÞsÈj¿þúá<|8qqq”””T[.+++üxÍš54oÞœ3Ï<³B [Õñ—.]Êí·ßÎèÑ£?~|×A]êéÕ«ï¼óŸ}öYx¿Õ«W×zþG°pM"cCŒ:u77¾•†?th®ÏÔfÍX»v--[¶bÊÔ©UNYüG§Ÿ~ü1?¯YsHÚ·—išáëeGv6“îÿ÷ýã~‚¡+¿ý¶^ë¾yô-¤¥µæ¯ý[…çþ}ü„;¸ù¦ëµ"""""""""òç¶7Œu»ÝtëvmÚ´aýúõ¶ŽqÚi§sñ AáÇ lX¿ž|à`7·FÑ11 ½r(=Ž9†P(ˆÏçç7þUïßçîÕºu:GÕ§ÓÉø wÔk(ër¹Âaìwß­äÕW^aÛ¶m$&&’ÀÕÆѳçñŒŸpwßug¥PrâÄ{ùâ‹/øâ‹ÏJ{† ¹„_ÖþRå÷øÑÑÑ p}ÏêKtt ¥¥¥,\¸€/ E‹Œu#íÛ·§¸¸˜×_{ÿüç‹nÓUW_ÍÃÓfûöØTÓù\.wÝ}mÚ´¡°°€9³ç°té—”••‘˜˜Èÿýß¹ 2„^§œrÀuÕ˜$9NLÓ¬r[÷TéÉN þÉ(¬xaÞÕ§†Çâ¼ùÛùç/Åd)ð™,ÚXÊyó²Y¼µÃcÑ8ÁÁÔ¾MX´±´ÂqLÓ<,GQ:Îp»{÷î aìÞiŠC¡P…0öÄO ‡±@€eË–Ñ¥K—ˆêƒÁG0W%33“”””:Ö¬Y´hÑ‚cŽ9Ævûö¯Çáp–ÁzMFôÞÍSƒ³x÷ºM|?þWî:g'O}‘¼ù}#š%Y9îW>¾q=/_¶•‰ÿ—M›&ö^H\~ùå•ÂX¯×[!˜·,‹—^z±A>äö_?6++‹©SbĈ‘õ^÷üyójÝçíùµï#"""""""""R?†±¡Pˆ'Ìv ðÅŸ3úæ›}óMŒ¹õrss™ÿöüzhqÍn~^¯—Q#GpÓ72mꮼr(íÛ·¯Sù;ïºû€ê߸qO<þ¡P·ÛÍø wÐóøãè˜Õ9묳Ãaì“'‡gSœ9k6ÙÙÙLž4‰ï¾[IçÎ9ãÌ3ë¥ {¹ÝîÏÓår2CŒ;–«†^ɤûÿÁßþö7:u*Ù{Ûícùqõj®üû<0yW]}5mÚ´=àvÝzË-%Œ­íügŸ}6íÛ·§¨¨ˆñãÆññÇK(++ °°µk×´YH#Z‘öò£ã˜~AÓß•¶?í¬<¿{š›E¿óÓ®ÊÛ |&Ãïæç›¢HŠvpùqqŒÿd>“_Õ!ðáäÛo¿eüøñäää„ÃØ „ÃØ7ß| Ê0Öï÷óÕW_1hÐ }ôQ[õz<ÒÒÒ¸à‚ ø÷¿ÿm{ÈxóæÍÙµkWöݾ};;vìàÈ#´}7Êþõ|ÿý÷œwÞylذ!¢?L Áå„Ó:3ö–¬ØKAÙ¾·‹/è`à íq;MÚ4 ð@ÿíôL÷òäçõó@×nÝØ¼y³gÏfí/¿„ƒùwÞ}`0ȳÏ<ÍçŸ^ïmÙ+++“´´ÖÌxáE üúÙ{}®_¿ž&Mšàv»k\—ú@´ïÐô6ûÖõ]·nO<þ~¿Ÿ#Gq 'Ð*-N:ñÛo¿ÕK;DDDDDDDDDäÏ«ª0véÒ¥|Ü /ºˆuëÖñëï³jöìÙ“‹ Â4-JJŠ™1}zx Ýê¶EÇÄp×]w³iÓF:t8—ËÅ«¯¼Ìà!—Àžœyäa,kßò’Mš4áÈ®]qÃððó»víâÍ7Þà‹.æ±G!%%•Ûn¿ ãÇå#yÿqÿýŒ¹õVÎ=÷­ÊégœÀ«¯¼R¡ ÃÀ0Œð¶ž=çÌ3û²ä£ê|ìž={rÙåWÀüùóøèøòÊ¡œtòɸ\.¼^/Ï<ý}Ï:›víÚ1jÔ”•y™þüó¾·...âíùûúììl¶em#%%•¢âbRRR˜7o.–e‘‘‘ÁçŸ}ÆégœÁ¬™¯Vh׌/0gÎlþvée$$$°qãF^í5†J«´4ÊÊÊxá…¬þá‡òý_x‘É“'‘™‘ÁŒ/0cÆ †^uUøzî¹gÙ¼y3ÿü×Ütã(öìÙ@»ví;n<#GÜÀ5×^Wåù%&&2ü†tèО` Èüùó³«VÕOõ™)õîÓ€¹o½ÅŽ;*muã(¢££Ã #®«Æ@6 ât:+¤¿}ÚF1cpö±{¥7­<úÑð˜ü˜SýˆÁŸÅ?.bäÉå£ýúÃë?”VØÇétV üq:tè~¼eËn¾ùæšNå Û½{7+V¬`ûöíœþùÌ›7Ö­[ãñxx饗عs'Ÿ~ú)W\qsæÌᤓN"??ŸÏ?ÿœðþûï³jÕªZëjÔ¨¯¿þzøq(bÁ‚Ì«ÃhÀ?ã´ÓNãˆ#ލqÝÙýåææÒ¨Q£®göìÙ >œûî»uëÖñÉ'Ÿ°bÅŠz]ßô@=ýE ¦cÎÜÅÕ¯µ¡ ¬ò>Á¥=sq9áÊÙéBÛú…ßïgÒý÷WšÃ~Ïž=̘>o¿ý¦ÞÛñG7ÝØðS?úècÏ|õvîÜ ÀsÏ=Ë«¯Î`ðà! <„á×_Wç›DDDDDDDDDDê+ŒmÙ²gœ~·½€¤¤$®zwLOii)ÇŸp׿©Sªq@×®]™1ýy^Íz…^È7ÝÄmcÆà÷û™pÇtíÖ­ÂÌŠ­Z¥±uëÖJ³¥nÚ´‘ÁC×Úö>XÌ Áƒ™òÐCÜU…²Ó¦M=¨S'§¥¥‘——ër¹ÂAì^Û¶m#//´´4[ÇÞ¶m>0™={öкukyô1þóÅt8âºwïÎÍ7ÝH0,T‹ ™þüstêÔ‘—_~¹ÖÙ.ãââ8õÔSILJâ‡Vѵk7¶eeU•333èÝ»Oå†AŸ>§rë-£±,‹{&NdÒäÉÜuçlÞ¼™“N>™nÁˆ†WY¶ÿ€L?¯×ËE]Ì5×^ÇÝwÝYkTw~cn»\ÍÃÓ¦Ò¸qc¦=ü[32ˆ‰‰©²ŸêÓ]wÖ|7 ¯¢O"TczdYV¥ud_økc Ui߯ƒ¤hƒ‚²}Û ÍâJûþQAÀ ¯mÓÊÍq8.(€I“&ñàƒÒ²eK²³³¹ï¾ûj¬£>”––²aÃÚµkÇ“O>ɉ'žÈ–-[øä“OèÚµ+ý~×D^^O>ù$§vË–-£¸¸˜N:1cÆŒ ÓºÖ¤¨¨ˆ»ï.òE«V­¸øâ‹iÛ¶->úh¥þÙkÿ 7++‹I“&±iÓ¦:Ÿ§Ãá¨vÚj;õ”––òøãÓ¾}{úõëÇõ×_ÏÀyôÑGëPìÙÿ¤à̺•!/·%¯´â5zg¿Õ¢Œ«_K§°ìÐL­×ë­rAñk¯ÆÖéu;˜ ÃÀåªúã$ V{L¦iV˜ûíq»*¿×E›DDDDDDDDDäÏ㢋…¿×ÿõ×u,_¾ü wÔ£xéå—(ózèÔ©3k×®¥´´|ÛÊo¿ / WÓ6€œœ²²²Ø‘Ío¿þ†ß_>‹ivöÛ€Õ–/_ιçG×®Ýp»Ý ºxP½­eÍëÿü‡ã |ýÇ–™™™äçç“’’Âî]»h’œÌ)§ôfÙ²¥ìÞm/yéåWˆ‹‹£´¤„—_~™’’¢¢£ðù+ÎNëõz‰‰‰©ò‹/ Ï^¹ú‡Õ”yË£\¿[¹’qãÆW ¹×‚ïáýýÚ\±âk.¼èB[íÿ£¦M›Ò±cGþqß½@y†öÍ7+øË_þ§Ÿ|r@ý Ã0*ä 5 "¬®êªÆ@vÿ€£{KéÍì?:v¯þÝ£yý[oøñ³_1òÔ8æ|WÂOÛ«™Z×iÇÜ÷û~ª –rss¹óÎ;1b3fÌ 77·¦Ó¨½zõbäÈ‘,X°€«®ºŠÔÔT.\Èí·ßΚ5kèÛ·/‹/æˆ#Ž`À€Š‹‹6lŸ|ò ƒ¦]»vŒ=:üÁYP(DNNNøñ¶mÛØºu+=öÇ{,ßÿ}•åŠŠŠ¸÷Þò‹ºoß¾ôêÕ‹íÛ·Û:ÏÔÔÔZ§vµSϦM›˜>}:óæÍcìØ± 6Œ)S¦Ôxü)S¦ÐºuëðcÓ4¹÷Þ{mËâÅåM¹þ”=8Ê×gzc?3W$²0`é—_Ò¹Kçj·_}õ0>X¼ø²Ï<û-[¶¬rÛ®]»¸aøõõÞ†k¯F·nݸíö±å¯»ŽçŸ¿Ïǵ×í«Ö¬™¬øúkvïÞ]ïm‘?‡§MåþI“IOO§k×nÜ:f ?öØ}{îyç±sçN~øÃlšN—‡£â`·½£8kÚØ/¤«m ¹mÛ²h“ž^)‹i×®=™¿¿b™êB¿åp8¸u̺v-_¶/33“iÓ¦Ô:²²²èܹ3­ZµbÛ¶m ºø¢Jû´jՊƳî÷é£ëêôÓO笳ûá0 LË¢qãÆ`ìÚµ‹ûî»—AâïW^É’%1Þ¼:/Iyí5ÃhѲ%cÇŽ%66–ü‚|¢<ž ûÅÄÄ„×?Ý_^^~ø÷¢ð#OMÓ “U޹{öep@§³úhqÿÑÆûKnÚ·ÛͳÏ=_áùeK—p?EbÖì9$$$„¿ñ¯ñæ›oTÚï‘G£C‡<òðÃ,[Ù¨øÊó ÿA0¬0Šó§íAþ:s…¡†Çªôswÿø åø°ˆ~_ÊG·&3mP"#OåáA‰öplT¸ü¨¾±¤7©l¹Ýî*?Ìrssyà*•‡RÛ¶mY°`ݺu#55• 0dÈÖ¬YCqq1^x!QQQá0vùòå <˜O?ý”æÍ›Ó¾}{æÏŸO—.]"ªç΃Aš7o^í>¡Pˆ;w²sçNæÿ>Ïø Aƒê\G‡hÒ¤ k×®­q¿HêÉÉÉáã?¦sçêƒÅ½~øáðÔ³¦i2cÆŒCÆ´H 4 rJÜ8çv- YBù± 9QthZý´Ü“eY†Á,¦Ì[õ‡êÞ»C=ú³eË–\2d0]8°ÒOjjjµ£g¦¼¼<‚øcѶm;¦NÆãOû´ÎÇíÖ­—]~>ò0wÞywßu'^ï¾Áx™<ñÄãÜ6æVºuíÆ ÀÎWùÙÛ·³lÙ2Ž<òH2¶n¥UZ« çкuzxtôþ,"Ï j* …p8öåz›4©Xv¿¢y¹¹øý~FÁÈ7„^ý5 ú~ª/ cþùgÞ{ïÝJû r :t ¨¨ˆï¾‹|Mã?%<žýö÷ôqâ”ݼ¶²¤|dë~Ú´p0㪊ëØù…œ8e7[óƒN˜¼¸(¼­O'7G·w†Ë7jw_W© ±±±Ÿ`}Y¾|9ݺu#%%…… rÉ%—„ÃØSN9…¹sç’œœL0dùòå 4ˆO>ù„f͚ѡCæÍ›ÇÅ_L\\\í•U¡uëÖ¸\®:ù|>Þzë-úõëG«V­jÝ?66–aƱuëV~üñÇ:·ËN=ñññµŽ†òuQ'OžÌ¶mÛxþùçÊœüvtLõ±a·‡sŽ,dáðM ?e †oâö¾;ÙUä¢cê¡ d·lÙÌi§ŸŽišLŸþõ4O>õ4wÞy¼òÊËÜ}ÏD&M~€¾gõeÆôéáú«Û©éÓŸ'!!gž}Ž'ž|ŠqãÆ3gÎìð”¶>ŸE‹ñð#pÏ=‰ŽŠ&Ú7îƒÅ‹yàÁ‡¸è¢‹#ª¿º06??¿–’ö-Y²„ 6p\ÏžÜ}÷=rŒV­Zq×ÝwÓ³çñ¬_ÿŸ~òI›˜”„×륨¨<;묳ILLª´_aa!Û¶mÃí) YPP@Û¶m«½ûðó/?³k×.²²²¸è¢‹1 ƒ–-[qúgðå—ÿ©s›†mÛ¶qÂ_N :&†þýTؾÿùíÚµ‹ ÖsùW„þfÍšÑd¿ wÿ~:ÚµkÇ9ÿ÷¤¦¦Gç.]¸íöÛ¹ìò˘5sfµ#ë¢ÆakIIIâñxÂsŒdì1¹~f!×Ï,äŠÞѼxí¾öÊÓ£1\׿TTaÿg?©¼îâ­[’*­G{Á_<\?³üwǃiš•^ˆÃÁ‰'žcÿ82voÛ·o_¾úê« alóæÍéСsçÎeРAdffÖiÈ»Óé¤Y³f@ùº˜iii <˜;wV;]qU¾üòKúõëÇ•W^ÉCX`ÛétÒ²eK à ..ŽŽ;Ò¯_?,˪u:áºÔ“ššÊ\Àš5kسg:ubÀ€¼ûnå» ª’››Ë¸qãl·å`è˜âãØ4/ Q9<üq*Ÿ­O eR€Q§îæï'ä²­ÀSûA‚§ŸzŠ›GfĈ‘UÞ¹cY<ù䇤=‡£'Ÿx‚qãÆ³ü«åä0ö÷kæµ×æ°}ûv.¾èb}ô‘n¥ˆˆˆˆˆˆˆˆˆü7ÛÊwï>,^´¨ÖÙ&÷7{ö,fÏžUå¶ïV®ä»•UÆ«n[™×Ë7Ž ?^±b+V¬?ž5óÕ*WVVÆôéÏW¹m¯·ßžÏÛoÏ?~ç÷ѳo½õ&o½õfåkÒ±S§p›‘‘Á½ï©—0Êg†òЃL¸ãNŽëÙ“ãzö |kܸ1ë×ÿÆ”‡ªvàÓÍ£GsÓÍ7‡Ïž5“ŋӫW/^xñ%~?_}ý«W¯ SçÎ ~1118~[ÿ[øuŸ?o.7Þt3 à™§ŸaÍšŸÂÇ‹ãšk®!µY*>ŸŸÒÒR–,ù(?þØcÜxÓÍ\tñÅ”••ñ¯ý“õë×üN«ÁË/½È #Frá…áõz™?o»ôÒðöªÎï±XΦè IDATGåêaØ1ãÜ99»yú©§hš’Rm?Õ§Uß'*ŠnݺqÕUWsÕUWWØ …˜3g6Ÿ|òñÕc{ì±ÕŽ5ƒlذÇCAAAµyñ†xþ~jt…çVo 2vN ÿY[y~ò==±ºX³f GuTDeû÷ïišÕ†±~¿Ÿ'žx‚iÓ¦ññÇÓ¢E‹JaìÖ­[Ù¼y3_~ùeµõôëסC‡†‡B!rssùñÇ™?~øuéׯdÔ¨QU>Þ«sçÎLœ8‘'Ÿ|’o¾ù¦Òñ½^/;vìàûï¿çÃ?¤¤¤¤Æ~¨K=k×®eذatèЄ„ü~?ÙÙÙ|øá‡|õÕWuëð´fÍŽ8∈ʞ۵§ÃbÑšD,*¡í›ú¸èè|ý´ÙÁhægŸ{¾Úµc÷·w-ÙC5rbb"³fÏ`ü¸±µ®…,"""""""""bGRRï½Ï?ûŒ… 4tsþ«wþùôí{÷ÿã¾ó¨ƒÅårqöÙgsÚég––”¯/ûùgŸññÇKþgg¡ü_sfß¾üç‹/0M“ÓN?¾}Ï¢C‡DGG“——Ç«WóÞ{ï†G‹ˆY€ììlÊÊÊ(--­0Jö’b ¾y4±BÀº×Ö]!Vo ±zs¶©NNíæ¢MjÅýæ|îãºg*‡˜˜’’’HNN¶{^ur ìQGÅm·ÝVmûÕW_ñã?Ò§OŸpûÖ[o1xð`222ÈÈÈàœsÎaÊ”)üôÓOµW(ä@Y©žau^6 òµm÷¶MñqÝ3§3Þ;un ¨·0ö@uêÔ©Æ0¶ÿþ|ðÁ•ÂØ­[·’™™É9çœÃüùóÉÍÍmèS‰˜eY•GÁ.ÄŠˆˆˆˆˆˆˆˆˆˆˆõ1¸¬ÖU¦].-[¶$WýŽÓöÏY®}²´Ò¡âãã S>Ü,Y²„7Ò«W¯JaìùçŸÏ›o¾IYYYYYá0vË–-dffÒ¯_?æÎ‹ÇãaçÎ }*"""""""""""""ROj²x¯¬¬,~ùÂÁûó’Xáñ‚e Š-záäè•§2˜4ÛǤY¾ ÏÅÆÆâñxHLL¬÷ѱ2e±üwÑ”Å""""""""""""Òê¶ø#––ÆÖ­[ñx<•BÙ§ß+£GG'«×‡˜µ8ÈÌJÇxùÎ(þ~‹gXqMÚ½a¬Ãá8l§*©«:²mÚ´aÓ¦Má䤤$<òmOùk) ×<èã‹Õ!†öwñîçA¶î(/kñññ8NmÚ´‰àTDDDDDDDDDDDDDD/¶Y€öíÛ“Mqq15¢¤¤¿¿ö0v¯Ù‹‚Ì^ ?öx<ÄÅÅÉ4Å""""""""""""""‡Ší@ E‹±}ûvbcc‰‰‰ÁëõÚ f=111„B!ZµjElll$Í9,EÈ$$$йsgöìÙÞ={ˆ%>>¿ßO À4MLÓ$ …§"v8¸Ýn<Ox[ãÆ5*VDDDDDDDDDDDDDþ”"d÷JNN&99™¢¢" 0 #¼Æ¬a¸\.‚Á –eaš&N§“””ˆ‘?µd÷JHH !!á`NDDDDDDDDDDDDD俞£¡ """""""""""""òg¥@VDDDDDDDDDDDDD¤ž(©' dEDDDDDDDDDDDDDê‰Y‘zb4mÚÔjèFˆˆˆüY¸\.‚Á`C7CDDäOÏãñà÷ûº"""zúw®ˆˆÈÓY‘ƒHÿH94ÆŠˆˆúw®ˆˆÈS +"""""""""""""ROÈŠˆˆˆˆˆˆˆˆˆˆˆˆˆÔ²""""""""""""""õD¬ˆˆˆˆˆˆˆˆˆˆˆˆˆH=Q +"""""""""""""ROÈŠˆˆˆˆˆˆˆˆˆˆˆˆˆÔ²""""""""""""""õD¬ˆˆˆˆˆˆˆˆˆˆˆˆˆH=Q +"""""""""""""ROÈŠˆˆˆˆˆˆˆˆˆˆˆˆˆÔ²""""""""""""""õD¬ˆˆˆˆˆˆˆˆˆˆˆˆˆH=Q +"""""""""""""ROÈŠˆˆˆˆˆˆˆˆˆˆˆˆˆÔ²""""""""""""""õD¬ˆˆˆˆˆˆˆˆˆˆˆˆˆH=Q +"""""""""""""ROÈŠˆˆˆˆˆÈa-66–©S§ñÑ’Yøþ"Z¶lÉÌY³¸üò+ºiÿu®¸âï,]¶ÇÓÐMùŸáj興ˆˆˆˆü¯šñ‹tëÖ €ÂÂB¶lÞÌ«3_åÛo¾ o÷ûýÜtã(^9“Ž;UyœË.ýwÝ}OøX{Mþy^{mN¥z¶nÙ¬Y³øú믪m×Þzÿv饌u##FÜÀšŸ~ --Y³çðϾÎË/½tPú¢&/¼“{õâþûÿA™·ŒíÛ·×{‡«³Î>›³ÏîÇøqcº)""""""RG dEDDDDDІ ëyæé§IJJbðà!L:Ë/»”ììì û=ñøãÄÅÇÏÄ{ïå½÷ÞeÙ²eìÞ½€6ðÜsÏ…Ëddl ÿ¾w[£F¸xÐ |è!®¸ü²ZÃÍ7ßxƒÓN=qãÆ3ì꫃Ü>v,™™Ìš9ó õBÍÒÓÓÉÉÉáã%KÂÏ]5tè!©ûps|Ï㨼eY©%""""""RW dEDDDDDPQQ1+W®`Ïž=<óìstêÔ©R »zõj’““غe+Ëd÷*,*bÅŠ¯«¬çÛvîÜQ^Oçε²–eñàCòê«3¹âŠ¿³cG6Çs,×_w-Á`°Òþÿþð#^{mÇד=z•™ÉO>Áªï¿oäáiôêu §~:÷NœÈÒ¥_’’’­cÆpÌ1ÇâõzY´è}^}åF¾…sÏ=—ËÅÒeËyïÝwyøáiüûÃX¼h›7ofü„ Œ{;Ë—/§mÛ¶¼òêLÞ|ó fLŸ^íqFŒI¿sÎ!11‘;vðê+¯°dÉGΧºòýû¨±ÞÚú!55•›GßÂ1Çô 2ùæ›<ýÔÓTÛO=zôàüþý1 ƒ¥Ë–³lÙ2Æ-Ë¢S§NŒ7Ž6émøõ·ßX·nm¯·ˆˆˆˆˆˆ| dEDDDDDÉÉÉœw~,ËbË–-õVObbg÷;‡P(ÄÆ êT&3#ƒ—^|ë‡ß€×ëeΜÙüöÛoÕîõÕÃxú©§xãqýu×óÀ2dð JJJ¸åÖ1üüóÏ<óôÓüúë: Ã`ÊÔiŒ¹õš5kƽ÷ýƒ¼Ü<æ¼6‡ä¦M9ꨣqà ”––V¨káÂôîÓ‡ÛÇŽcè•çŽ;ïbëÖ-¼üÒK5wÇŽl.»ürx`2›6n¤s—.ddfT8vMåßyçíjë­­¼^/S§M#::†©S¦àv{¸ñ¦›¸ÒýÜ2zt¸üþý´ví/üå/!¿ Ÿ‡|Ÿ¯¬Æ6.\¸€šB à¾ÜGRb"7Ý<9´ÈŠˆˆˆˆˆ4 c=–¥Ë–PRRÂã?ÆÖ­[k)Uû±Fޏü±Ò¶Ý»wsÇ„ñdffÖùØK–,á†#ILLdÑûï׸ïòeËx÷Ýwðû|<óìswÜq|ùå—ìÈή°jçÎ]èܹ3Ægݺu¬[·Ž¯¾úŠ3Î8ƒwÞy¯×K0dÇŽì*ë›:å!fÏ™ÃK/¿BJJ ×^s Á`°Æã>÷ܳôî݇6°à½÷*·S§Î5¶«ºzk뇜œ:vìÄÄ{î ÷IBbcÇŽ#--¬¬¬*û  RVæ ÷EMç¸aÚ7oÎ}÷N ¦nÓ¶-W\ñ÷_?9¸ÈŠˆˆˆˆˆ4 6ð̳ÏPŸOff&^¯7âcí]6|ìÿ¯_ÿO=õäØc µ£n¼‰K/½€_Ím·©òØ£GßžÞøÖ1·U ÿ(7/7üûŽ;hܤIø¹5?ÿ\aÿæÍ›0eêÔ ÏgdT±Zm}¹¹|ðÁ\zée,ýòK6mÚXëq×­[Ç„ñã¹zØ0^yu&?üð“îÿ;wî¬s»ª«7Ü®júÁé*ÿ§xvö¾é¢÷NQšÚ,ÈîßOU©©ÉM˧·Þ¶m[¥zDDDDDDäÐQ +"""""Ò€ ‹Šøö›oʱþ¸íþŠ‹KXõý÷lÙ¼™½ñ&#GbÚÔ©,xï]V|ýU–=í´Ó8ãÌ3¹ù¦1 O=ý4çžw,^\åþÍR›…oѲ%{rö„Ÿ3C¡ ûï Aï»w"ß~ûí¾ýL³¶S ==‹.º˜ï¿ûŽSz÷æøãgåÊ•µwéÒ/YºôKŽ=ö8&MžÄ7ÝÌ=wßUçvUWomý_@«V­X»¶|M×-Z°k×¾@xÿ~À²*<¬©íÚµ µY³p=M›6­²EDDDDD¤þ(ù“HLHàÄO ?ÎÈØZiDd^^/¾ø·Ür+}ø!?üðCS'&&2æ¶ÛY¸p«V­àƒ3zô-¬üö[vïÞ]©Ì‰'ÄŃ‘••Åõ×'??Ÿï¿ÿ®Ú:~ýõWÖ­]Ë•C¯¢Ôë¥ ?ŸV­ÒðzKÃSúVÇétrÏĉdff0fÌ­üãþIÜy×Ý ½òï5·  €víÛ³níZÊʼW˜n¸¶v-_¾¼Úz‹ŠŠj쇲²26lXϵ×]ÏçÃér1tèU¬úþûðèØêìÎÙÍ‘Gvåä“OÆëõ²zõêjÛøõ×_³{÷n®¹æZ¼^/ñqñ xaÇ‘ƒÏÑÐ ‘ƒ£ÃGðèc…úö=«ÊýÞyûm6nÜÀØqãp»Ý5ó–[nà¹gŸ ?÷ÌÓO ™0áŽ*Ë,Y²„SzÂäI“q¹œÜuç5NÅlYãÇcÃúõŒ7ž§ž~†+‡Ý0h•†^u;vâ¡$ òè#ŘÛn¯ñ¸¦e1dÈ%<÷üt{ü 222xîÙgêÜ®šê­­,ËâöÛncÓ¦ÜsÏDÆŒ¹V­bâÄ{j=ß™3gRRRÌ>Ä ÁCjlc àÎ;&à÷ûyè¡)\ò׿òòË/ÕÞ©""""""rPM›6­Ã?qEDDDDDDj÷ï?bÑ¢÷yú©§º) Jý """"""{i„¬ˆˆˆˆˆˆTFC7á° ~P +"""""""""""""Ro4e±ˆˆˆˆˆˆˆˆˆˆˆˆˆH=ÑÙÔ¬Y3bccºbS“&MhܸqC7ClŠ'%%¥¡›!6EEEѲeˆn†Øäp8hÛ¶mC7C"Ô®]»†n‚D ==—ËÕÐÍ›Z´hAtttC7ClJNN&11±¡›!6%%%‘œœÜÐÍ›¢££iÑ¢EC7Clr¹\´nݺ¡›!hß¾}C7A"––†ÛínèfHZµjETTTC7CD²""""""""""""""õD¬ˆˆˆˆˆˆˆˆˆˆˆˆˆH=Q +"""""""""""""ROÈŠˆˆˆˆˆˆˆˆˆˆˆˆˆÔ²""""""""""""""õD¬ˆˆˆˆˆˆˆˆˆˆˆˆˆH=qÊÊâc¢ézÔ©¶Ë™¦‡Ãc¿B+†Ûv±€;¢bì×gb+âvN,)β< Ã^6nY! Ãi¯}@Ð…•d»œa± {—‹ áöî¶}n¦åÇaؽ ËA¹ åÇe£œÓUÞïÁ@Àö¹…€P\*†a«–ÀpØ¿–Þ=8C!ÛåL3ˆÃaóõ6Cû×d¤¯wÈåÁŒnTçý†Ë2h*ÃrÚëKËgÖ”¿ÉëδB8"xŸúý¥”Ù.gZ»°½0¯iÿ:‘ÚÒ@65%•õÎcm—Kv–°‡8ûõQÌ.âm•±,‹Ô@¿ýʼnIÈæ c71ìr¶·Ð¥RÂ.›}bYЊˆ²UÆí °ÙIÿ—K1 Ù䟀“"ìõeÀ2(NéßæM ñ†bË^?$[Å”¹¢0°÷æI¤ŒB»çfBjxlfâ†ia9쇿†‡êø0 ‡aÐè¨R‚†Í÷à°LL›¯€a™X6o¸À b.ì÷.ËGа8-?!›73XX8,0#¸QÀ.‡ÃAçN~,£î¯÷^NÓO(‚±œ¦Ã^_Z{ÿcóõ60I(üG°ÌV9ÓW %yöʘ&Ö½ðÇ4µUÀa0mÜœfàp8éÜ9ˆeÙ{°°óP$¯€“Áê3BA,§Ý›Ž‚8œ®ò;tlˆä}Z^ÎGÈæç‚átÐ=ùkV­úÜv}""""""""R¿i ›³{—ùoÛåÊÊDGÛÿ­¬ÌOt´½/Á ,òÌhüŽFÈZvÒǨ(–¯”ÆF1–½ïª)󈎲Û'…!eNûáv0Äå²w¹8 “T 1mž›ßÀcûÜ"/g÷úr»\XXø}N{_à‚y®F`3h ø}´÷Ø ,‹¸P!ñ.›/ð‡p{ì6¡`(ÃAi0‚×;‚sƒÈú2dA¼ÓÛf¾ƒ$ÖÄtÅé´W.1¶„ÝquÝå©¥tÌ[k«€Ó L”ð{Hm¯ˆÃÀöß|ˆìu3M‹hI´iÿB1–ióýmA±cûýírZCö?+#ùÌË7âÈM8øÜv}""""""""R¿i ëµ<¬*=Êv¹@ ˆÛ´ßTȇǴ9âÂÃáÃpD°¼®­Åt 5bK( Ëfòâøñ„lޏ°À´¸ìg_„¬ν`ɲ,²Ì6¶Ï- àÙodÐïÇe·O€`0€Ë¬{}‡ 3dF0õ°‰Ómÿ›ñ Àå³Ù'–E0Ô‡ßþ{'4qíN5 ¿íªÊ_oý®Ï á2ë„8”ý¸lžlt¶=%s èÃí²?êËòãr'aؼÀÊ‚DÛ’ÜmàmîÇnúk8 ¬’3äÃãÖy”™ÃéÄãöà-Þá²9ã ¹0"¸ÁÆ 0lNmmZ!<.ØœþÙ ”`¸íß(cŠ1Üvg0ØtãpÚ¿.íUc…·$·;d{T¡(ÆaûÜ"ëKËp°+õûèæºs`ñWãcœ–½>#à§‘Ão3¸´ØÕõf+[uXÁR —Y ƒ¸ØXJJŠ±Èš>ˆ`¤«(Âaã(¿.`:q8ìϰ`}6?›- ÜÎR0í¥¤V°ÃeÿýIŸ¤M² ]t>g¬íú ,,›¯·ƒf3c8,¦ÍÑ¿—ÿ+«V,°]ŸˆˆˆˆˆˆˆHUœMšãˆO"ñë!©ï²8üÄ»Ñv±Ò¼±#˜’nO€˜dû!Vi®‡ÇþhË2m­)j¸ÝX¾±<¶GÈFtn@qŽ#*‚s+ aDÛüÒÍ´ˆieûܼùbÙ?·Ò=~b“í²eA¢“êþVp:`A0ÂþÒ –iÚùh0’ìˆv ¶I`iO¬½“3Mˆä>»ý¿WÉž2 ÷›Ó‰a8å•âN°Ù—NHHŒÅ沺ŠC¸ã#5¼'ˆ'Îmû:qå‰il³‘ÄÆ`•Úœú6Âu¬¾GŒs3p OÑ»ÃHMÊ,QŒœ…LœvGÀ‡BxÌhì~èùœ¢ÜöGù•~¢£l†CXŒ2Ü6G‰GÂáråðáÁÎë]Îçðeûõެ/- äòã´ù2áç±;P<°0œñ¶n¸°,‹h hœo¯2ÀàqÛ œV!®¨í‘Í`ww}•¿n6odÀÄÍY ²Y?L3ˆ3mûZö‚x"zˆŽ²×'.€ž¥»)óF°æ¼aaÚ¼˜N‹P£]‹ ßæ G–‹õ ]èœüµíú,Ó°y1›–ÉúÜÛu‰ˆˆˆˆˆˆÈÆ9ÏÜ~Hê;¤¬¿ÄǦAI›CO÷² °9µ\y9lM=¼_Á:ïššBQQ1^oiUâs³9ó¾Ê"éëíÁ<‘ÔפI,Ë"/ÏÞ€ûêŠ@¤ýˆúäÀÈë]÷“‹‹‹#&&šœÝ9½ì.' DÜÿN—WLϦ…íhÔ*w$õEÂ0ˆŽ÷Ôù%w:ÄÄÄ[˜Çv-|¥~»ƒ3ËKFð>ÄÄÛ¿ %PÄÁ,e!<Áÿ¿íÐØ.‡ÃA£FÈÍ˳õzïå/ á±{‘õ¥a€·Äo{®Ý˜ÆÑ4´9º¼Ä$¾™ýõKsJÈÞjÿïNÈÂic zÀÄÄ$ò ómÒ7&·ýË€7hû3ÈÂÂWâèÏG(dátÚ\÷÷Ï.Ûïo_w”ýkÙï â Úë“f­ZÝ>ÝSl×gX¡ß×{¶!è—ýá,_!FT¢­2 ±¹Åäyíúb Pjs­á iq¬õ#«¾Zl»>©,öÄÿ£Ñ…7àlÚ‚PîNv>2ÃM«ç“÷Ö“.z…¨®'Ò|ü ä¼x¾õ?ÐjÚBv=s;I®%”¿›¼×§Uzn÷c7{Ò¹$]x®ÆÍðgþFî¬É2ÃÕ,VÓ’ûæãÄ÷ˆ«IsJ¿ÿŒœî¦ÑÅ#‰ýK? à nÖjvO¿“Ò¯…Û}toŒ¨Š3/ZÁÞUŸGšòÚ@ÖáöÒãxÛåÌ`‡Í‘ f ˆÃm¿œ;:WLS\Úü?1)‰ØÂJr÷Ø®+Òss¸˲pF”ÒÅ4N¶]&ä+Ãeï |€²ü<¬Ò(+°»ö©eFÔ‘¾Þ‡“¨¤º¯Ã…Ûí!jON›ëñänü­|°¤!¿`i‰írX`sL²ÉÅŠh‘ÉÈ62xOTM›&³mÛöˆþÐE;Ft„½s WEd÷MH¹úæt8°ÒÝlݲýðï#²|Ú0à··Ø/H¤7TX¡>ϱ×'†aÞ¦ [·l­÷ºF¹ˆüIßߎ¢Iëå¢it®íúLËÄaóo¸?ÄÁÿŸûe¶GÀÑÇ”s´çûõ… ¢œö^¸çžÄž„#éôÝm•s†ü„œöBjÃá IYQ¥Ü{Âöt-À¯?,¡Øë³]NDDDDDD$®–íi:üA|VSðþ˸[¶#˜³ w˵–m:üA¼«>Çûê|ÎÕ¢M¯€¢ÏæRúÍG4|Moxˆì»…÷O:ïjòÞz‚˜}ˆïu>¥_@éŠIâ" Wæ c/µ,‹€åƲùMwi‘—Øûxa~1‰ì¯9XZì%6¾îõ9*}>Ÿí)ƒÁ 1.L›Á^Až—¤ÆöúÄ¢¸$„'Ú~øèó–c/Žd Ho‰—˜8û¯wÀç#>ÖÎTÓ†ƒ¼Übâí›Ëå¤0x*A›3¨Êü¸£í*-õâNlb»\ñž<â“Û*c8dm+ `sFM3dâ°9¥/€·°¯Ï_>uw¸œNb¢cHÚž…ÇF€aãvÛØf9 è/Ãå±wø}>J K0m®!(,ÂhÿF™@Aî${kÆÿ³wçarUuþøßw­µ«ª«zIg%@d0``¾. 3èüø‚úŒ3‹3ÈWtAYTd„°/#ƒ2#0 ›ˆ â¸à *6Y‚’„$^ªºöí®¿?šDbBÒŸÓéêîð~=Ï’:uÎ=çž{Eè9œ IDAToÝÏYtÄã¢IÙì4)MÓ‹Ç0wdÍÆÄÛ{3§\†-<6p«UXÂAGšn ™ŽÃ¶w†øÃϧV¥ó›M¸­¦(M éÛ‘è륯V…™”ÕI&•A¦4&^‡Þ«Õa&åÏ&*ç2 !bÉl8?§Qƒ—=/xžƒj±Ž@¸‡¬[-Ãê’ŸËN©;#»veÒ) ½üßhUžç§´¬¯âŒh¯åÃ΀·£1؇ÏÇCO/ÏÏkÀî5Ü›E÷Ø ÐÊÂeœõñåÌ¥ÖDæcTßW„O£‰r({†jÁıñÂoEé4ßChÈŸóÜFͪÂìþЇ¡l~ul éM©èþ‡A3 ”îºíÕãï-&ú¸ñë‡P¸ù|€Ù¿p›¿K¾ÿ£Ð ©÷©÷Àxl ¯û [ÿõC¨ÿâx#Xö>èÝýpŸ~@¿VB{õªmòÍßø%@Ó‘Xö>@ë…ßbdùg )cd[µ*~yÛ]ât®ëò–{s\ض|­j¹Ž@e¶˜p:C6›E³Õ„•—±ÓÇ!tዺ@&+é¯ÚÞ®ãÂR¨×õ` fÖ&“I„aˆJ­C8•Ás=Ô«ò%ª}/€aÊ_zÚ±„|f­çù0…³Vý0× ¯ÿÍêµ&7:Go¯, hÚm[|(«èî–.Ühcî<ùê×*õïjÕEW—,ãzÈ-ë•÷ï‘(úûdeµ:±l/ïûa\ÿ_ç7ÓYQÝ º<@D·ÀJ÷ˆ6,TVïº0®º h–,øF±¨¹‡òcóܦ0(®×cXÙz¼®¿¥ë Ú¨êòA~=‰*jý1ñèÝZ…P6Àà ½¢<û?׉ÒÑÔÒôñwäÛ®æùÚ‹–×&ÁÛ™¤äåwòwã¿7‡¯:Î+Ïýé¯ý?ý¨j¥×þà½>ÉŽùò7œ |ê_a$ÓYþÏɽSíh@Ös<<ùèÓò„ŠKË©/Ig(î»)‹ÈVûZhÔj¨ g׌g¥X'š.~!¢.ÏŠOÖÙö–¦Ëvw¿¶‡lIé<Ñty°YÕxý«,©P—Êë2ªžË4ÁòЉdÑh…|^ž€W~¿òTÞÄW©Ÿ†a(N§i€nèäžÁ’"F¢Qä²9lܸQ¹{«›ÊÞÆ²cÛl:.ySÝÞ†a`þüX·nÝn['–mbÉÛ–(œ&RYyÐrýê \»íèÎHëDÓ4,Z´k×®ò¼vE:öï?9òø¿Æ»>z4–}êóâü|ßß²ÈD¹Í,ájÐ*!šBÑ5 ¾¸ ƒ¿ù¥8?•{ã>GíÞy6¢£²d»í"‘=×kšŽFhàÅÖ>>38¡Û—µ›aÙ8!ö;ô¯ˆÒ©˜ôÛ’†tˆPw$„Áæßí…ÕÞbaNDDDDDD4ÕZ/?È|ø3¨ýâØ ÷EåGÿ¿œG†Hö—ðF7"õ×'Ë¿û÷#ô\¤ù”îÿŒdzW7j?ùÞNÓõ*ìEû!~ÄánøÜu/nýßÃèµgÇÕ&13v³Žd#ÉŽøôWÅ霱QØÙ^qºöð"ýsDiB„ XYùl¥Ðó  fæ§T„fEÄïÛ#È—. «”é“Õ xå2Lár‚Ó† a ;8·˜‡Õ-ŸÕR:6§˜‡-ÈoóŒ!§Ý„.Ü'ÌkÔÉeÅ3£š›6"60O–(Zð3òYGn­K¸¤i¸Ðt…ÙÞÂúßÌ-!Ò?0áÏožÍÙ”Ÿ'š†ÆðFH_”z­̨|¹õFe aà‹¯ ­ZѤpÉbÃÀغ—ѮȗTá·Ûp[Ÿ%nÛ6ŒLѶ¦´¯ÂŒ¨ì @Îö=n½¦—|©P@-ÈV,Ö/¥-¡i"}½èB nS¾²ê±©Ö¥•è‚!œÍþå³â¼(•ÑNu#Ò»@œNZ—š¦AÏôÃîõåÃITÇ (î·mØX1ù56ôhÂ%×CßG»V‘ç¥Ü¿Ñ #È6Ñ.Œà#ï‘ß÷LJmË‚m¥b™nyýoÚ¨c`ž|yý±£>„«VÉûœ¦pbþñ·£hìWEèËnÄžÀ´eíÖÕջς´¡ Ëé—ØiÙõÜŠÙX¿®/ ¿K–—çÂ0V¢ñ]±´øØ· Û” ^I'«[=è¢t|„iÙõU7uÀ©à7¿úoY^DDDD3Ìœî ,ØOœNå7 ‚NføQ…m”Âæ§!B…ßczè!PØbÐ\øÂw£†a çºV¡S¡‡i=†žýÉ¿OQ‰èÍÂ]óÆn» ©¿: ¹_wp Ê÷ a½‚Ò]×"õ×'£ûoÏDåÁ[aÍ• ´õ6­Áèõg#sÂéè;ë:õ*ª¯˜PÚònF÷‡þ¹ÏEþ–¯lÅkovA0´žžžNM‹B̈ããûý£8]Ù)!mË÷,:EtÛòeâjµ"R¦|/Ò ô¡ ö:ŠF#(·«°"òýÖÊn iK^'¥ZYS~ÓkúMÄ YPà \èqù‹ºªSA—-/ã˜[DÖ’··4?Û²†@ÓmÁîmÕpHúò—YªçòXXC&&O×ðˆ²¶SÝë«Ú® +¢ÐÞÍz´‰§3M†a`´–GÊ’å§C‡–MþˆlxMÄM…ýý&rYùà‚ÑÆ(zã²Á+¡®cmÖAÓpdéƒ ®ïÁLua¢£4]‡eš¨æa¥åç‰W©À2åÁÇÀu¡[²öÂZW|<¸$àWk0ºä÷·\×I ¨Ö`*ì(‰DPkÔEí½™W©ÀLÉÛÛ¯Va÷ 5 ¨5  À~ÌF3C Ü«°Y…iÙâ:IDº‘uS€ßhÀÞ‹#‘(Ú­¦xЦ×hÁ.¨µwÀ+W`[ ý»í@TŒT®üá×ê0:´¯®™Œ£TÜ€_­¸RœŸÒª'òÊôçpÎM_Âóå?[œZvRv/Ö ÷^õïyfÛ=dvµ9sP®VÐjÊö–VÕ5'·ÿíâ—Yn݇•?çµ "©ˆø\iæ=Äzd÷ªÄH€ß¬>KxO ¤ƒ¦|]‡Õaš²”vІ£°ü³í»p ùï=Ä/øŒ €¯ðRÐö8« ´uy:+ôá ~ŒŸ‡Úv–IÛ93ðá)¬tdûm8†B{…:1Þ°«œ#`]þL)í4hšÓw”òÓ"öp>|¨´·Zèd{a_@`ù.\Ñ5Hƒ®k°Ü&Ú }À <¸*íÅuâÁW¼XWåÚå;pΕëJ}èºÃk+Õ¿ò=Nñzb„!|á3†‰T®yjýTõ> -§®ëƒ@iý vËG!ˆ¿6qâæ ‚!Ç…À"w¦/Ü€©ðBYÛ©\' ¦»hò箄é¢îÉÓE4í°3óæTòÒàÙUÿ1E%"zséh@6 CDnBê/|&‘NmíUHFà÷õõ¡V¯¢Ñ¿€™éǶ%M§Û­éº_[²¸T*©å¥Pÿ!h Œ!ëªç‰\§Îåd2h4†Ñü¨Ò±)Íp‚â*΀ây"o·À[Sû iʪËpº¾KØ6M]É$† #ˆ(ühu<¶ÂËK•=rý0€¡ð¢Îõ¥ qÛsQHçú.,…»º®#›ÍbÓÈ,…úw<¶Ê±)Ö¥ø0„?Ò²foí?n(û!YðÊHg„«~„@µ4Š—òÏíü³Æõ]Qhš†\.‡ÑÑQñµÙ <¥sKµ½Û¾ƒˆÂÊ íß¾KéÚÕ†mÊž™îÜw¾ ßñMq~*w,¥ñÂÀÛ²wÌDiº†%oéA_¿|¹o¯íÁŒÈò{Û{Þ‰a/…gŸ¥sJ%ØÙ€ÉX,Šòð†Ÿ^”ß….¼Æjº†Ñ§‡ï Gx(>Ôh†K8kPš½–‚²æ” ¢tºäõ  !Ð¥6Pè“hož£Ü]xlÊ¿QÎ-@Chj×<Õk¥Âû…ñsKá^¥T'“¸V*¤SûÝ>™vS<—¯•ÚkC.Dy!„®ò¾E±½U¯ òþ­AÓ„ ×®$êH§Kh 'Y´[ØÖ9”ÃÎÌõ}†Â€ôÀs «¼[p[0,Ù åx<ŽF½ (LrQá». á„0ðȹ2 Ñ®ÐÑ%‹5Mƒ(LïÔ·»ëX¸YÎ… 'p;_'Ôévë@:7t†¡z»uÚî|ž8¡ &ÜÐUû…³ÅÓÅg;~—¿ˆD"È¡ ;6”¤Ó&¸ï\: Ã0° ¶k kv»cÛLƒŽ‡†,N§Z‡ ·¦Ð¨µOÊ^øD1<öÛCðì¥ @Wè¶šð[ ƒO¶pÚ Ù4Ö ¾E”.Ón‰úœîéд(Ê}=BÙC¢ß(ÀˆË—÷šE˜ +ßAºp¶Rൡ …€ß,ÂP(£×ƒ“oä;‚•ŽLÓ€¦ip]ùýÔw+0„«ìêǦš.ðÛÐ…ƒàßoŨŸ“~³#6ñ> :LÃD«–‡®°’Öø9ÙKîÀ­C·ä+\x1˜ñ¶·×‚nÊî~І¡0ƒQÚÞš®!bÛ¨ ÂT¹æµÊ0£²ÕB =hÂÙ®ªíí7Ç`¨\»Ó…nš°œ*õEQ†“×ÿì¸ÇÉû ø­"ŒhçîqÒó2‰ÀqšX® »Y…ôåœã·`{òº„Y‡eÉ_²ùa HøjϰíÀBDa…C'°aû²>ç6M´ƒ …rªðàÃôe÷ÅP:²ii4h4&¾u0$+¬úI4 ÈÑÌ`׬?|ðáÏè2Ò¶Âo‚v à)Hg¼p|–€¿[·ÝîiSkZwÞ„„¦°¯®ÂJ^èÁTXÞÏ XÂåÞb‰ Núø·§‹óóZM˜QYàØ°M|íËѪ WCQˆ¤Ì€f…Hv+l—âã{™ ìØxïÿyØ÷c¢tNÛ…‘¿”j·]èñ”xð]m¬ˆdVöÒ3мúÊ#H¾ã%Qº!܆P°å€iš04¹êz„®¬ ZQÑø&Qh7=DbÅé|/€!ùÖ½ðŠ8Øæù>L…øBdrò6­zÑ„lÆË¢ƒöÃÛßú>\vò¹âü¤ïs¹`‡ˆöÈëÄsC˜Â—‰àyL… YÐ¥3àÒê/¹=/ïÅ žÀô¹X,ÃÐQ«Õ¦<¯-éTM!° tº½X 礴X¶x,†B¡¨ÔTVJðü¦¡Ðnªý[!Шۂ0„®°ñ=†àœ4 éL#C£JÇæ»> … ©Ê’÷¾ÂPè§®ÀR86Õt*åT©Þ¾> mܤTÿªç²ôüÚLå|Vé7€ú±© œßa®CÙl¥rÂÞ¬­ºƒ±5eqºñ§z…@Ý,ˆí©nÓ¥’nî¼yÈæá8my† fÃJSD»³Žd»"ò¥Q”)^=ÓÑ(,…ÒÍIzÒi”u›üέ…šŒD5åÍ®¸ƒ, õº8¯™.itòl[|~ºŽî˜|y?Õs¹æ8h¹ŠKôJ©>­(ŠÙ6‚=‰"‘¾¯ôà±vll6<3Ñ›Xîž³››Aÿþ»k;öœñþÁbñ1GcNÏ"Q:¯V‡™”MÓBã>œ”|¹7gtvoŸ(fxö®[0úü¯Eé&€Wyé©òXy¸ÃQ‹÷Dnߥ¼BD³²å»’]hóX÷ø£¢t—iŸÎt©t–i¡PÈOy^Ó•®“:ulÑX ™t›†Fgì6+Ó•n&³, Á›Öw®Ý:mwmokq›Öȯ“ÀÌ?¶É˜ñ×…ù6††Gà)¼´âIñóøžCás$׋h:#Nx.tS6k5pè–ʲüM˜ ïo½F¦p©ÛL:ƒøXJ,BAà´¡Û²øLè{øÃ¾?E%"zsÑzzz:cHG£ø÷~TœîÕb »åëôÿqt{õöŠÓ­S »AK0²4‰ Üh`^:-^‹}M>Å==Ò"â•|…J©Ù§sƒ©á±m(1¿ƒí½±T¼ÌÄÌ×6­láƒGéµ5ë¥u²±\Ƽ´|vA­Õœ|ÿŽB­†\R¶tžëûJ¤õ¿ÙšBéèÄ_^š¦ ]×±¾P@¿pï:SבŠF¶w¡Ñ@NaÏ5ccHX–8¼¾XÄaß±tÏc¸Z¥SYÝp4l…¾Óò<¥6qËB–ÿ ‘ÐuÝÝÝxuÓ&4í½YÛó”Ú[µ.ÓѨ8]Ëóðà‹/ЧUyA€¦Âä}z{±—Â}_Z'𦡷·ÃÃÃâå®Të¿íûˆ(¤³t]陯ñ<ñýÛó}”ÚmyÿVÈ Pë½½½xèé§1\VÝN¯Ñm’=¡ðNì ]Ön™LÝ~ K¸¯.€š_AÒí§h-Zˆõ‡ö R¥s›uX1ùþzÍB ñLˆv¹ˆHZöLÓ=ЃC–v£Qö-DÌ øÌ`Z&<3†5n[6¥6:„dïY4Çòˆeå÷¿Ý†!|r Ø Ï°õB‰œ¼ŒõÑ$„ƒ  ])!’šøïÃ4¡išÒËêv¥ŒHJþ{¬1:‚¸Â±©Ö¥ÛhÀ¶]ÐnCWx^V='¥}@ÓuX–‰òðb…}7}šð9£Y© –’ïW[+Œ ™“·w-?Šdü]†Ó¬Ã^›}§ Cø"căW4Mƒ‰ °~’½ýâüZÅ1D»ögu]‚ÛЮV‘îo QÈ#®ÐO…QÄsòönתˆ$eåô=†0€ÅPܨTÿµÑa¥önŒåW¹Ç)œÏn£+.¦Qí§õÂ( íݪT\‡"Ñ(œV¡Bø7 Зð' ÕÊ5$Ó²w‡šØš‹¸­0ÛXa9ùVÓE4&_z¸Tl Ó-+ÔÍÉêÄ´L”Šu$“™ÄV­´Ð% êy>.ýøW¦¦@SŒ{ÈÒLÓѲåf'¯X!N§:šH5`ЩÑK½}}¨V«h5›ò¼ÂPi_Õ:QI×éÑcjïl6‹0 Q,•äë›)êô¹¬BÓ4¥MÞ•ÏaH$ˆÆbUªKÛ4ÅåTm7Û0”‚ ~ÀPXnì€9sÐ%n€®iJí–ŠF±G"1áA ¦i"‹!êyH ëDPlµà+¬B ¿¶W•D̶±(›…Èf§•›Mñ±je4MÃX½."µ¹îºb1,ŽÇÅù©Ö‰J:]ÓPh4ÛmÏlßýØÇà ϯ¡J{tw‹\ U«xidD˜j|`NRØ¿Óé42a(¾ž4q…`©Ñ@FáÇNI±kº.îßQÛÆÝÝâþ]iµÖ? v./èëÃÛ²Yœuï½âühkíÀÁ¯ó¿éH^æ*å Ú­–8mˆÒ»qv][<ÎZmºMÄ,ùìëš"›‘' M¹ªlPaÛKaíãÕ_ß'ίR¬ˆ>ŸJ¥°à- °ÏÒ%ð Y½bEäâò§¨b³„î¸üš×ÖD¢²ks-Äâòk×X½ˆ¬B Ñ1äâòg“ª[EW|âËû™¯d]…€lÕ«¡+.離ǦZ—*m§rŽ@©YBF¥½…}@×uX¦‰‘x鸼íüÀ‡¡Ë²5¯Žd\þžf¬>†¬J{GÇ˯±õ°‰D\¶·c¨í >ÞÞ€¢ilËÂ`l 9…wÚåVI©½U–û®û $â²—õP¨!§ÒjcÈ©´w /§ç{0 Ù«ßh4ŠáX^©þ Ší­z=Q9ŸaC)ÐRˆ•Ú­P+(¥“^‡"¶&ZJKÐ7ëu<û“gÐjÊ–Ìõ\¦pŒ ŽÂi:ât!hŸêûs•ý‰ÇÓÉ÷éîïïC!_„çwf…C•c“¾/!¢7ÖѲ´µþþ~T«Uñ( š^[²Åât…’É$b¯dg<ÅFU†®wnY!MöølG"èÉå°apPøØ=.:6pBzl›)Bfl† `íºuÊeìt]JëD×uŠýTuö¯§|”Ö‰¦iX¸hÖ®]«´UAGbì߯óÞ·½ §x nûíoÅù©”SuOQÕÙýO b}©$N7Ó  X,¢¥U#"npÕ—Ya·´8dé_aááïÃ]7|NœV:¨°'×/ð”~Ç…AMigÅçC…6PnoÕcëP¤R)X–…B¡0åymI7ÃëäµDJý´Su‹F‘Τ±iÓPÇ~#±½'Ÿ—iš˜Óßõë7töš§`·no{ì±Ö¬YÓÙ:á=nÛtÂrΛ;###p=ù²aÂ÷|¥I*t;ª´Ô±ò~zÚ V5ÝÀÀ ùW¤V¢P'a©ÉVÖ›)8C–fšŽï!KDD;¡iݯV:ã«£|mßÏB¤éåc|ÙçݺÝ&ÑoêŽü‡V'i¸Agwn»ÝÔŠEüdõj¥--TVXh:b 3¢Uf G Çx NýÞ÷ÄùÑŸÑ€v ›ý0[´ËE •Ä;þßy”áøòÈ‚‡/Ã4àÕ«xå·?‡Û¨‹ró]†Â^f*ËNã3¤³e߇®0àB¹ŒŠû»I÷’K$ÐuaŸü…¢Ê¾u€ú±)×¥BÛ©œ#€z¥}À²m$’ dºú•òCš°xt…`ï90Ìε·ÊL¬0 ©´·°Ý Ó@¼;‹îXV­(,= a@¶·ï{0„³HI\ÏUÓ)”S¥>býýȘ)¥úW¾æ)Ö‰Êù¬ÒoõsRý'»Å{zÐ-* âM,BnÏ} Ó¶óyD¤¿=4 zÛm9°™Êû~«#*¬¹…,…-à¼|¦°NlËB«X„.Ü:N•W.Ãn‹x.~zÍ—§¨DDo. ÈuP'ƒ«ôæÑö}|ïé§Å{?©êäö]‘.û›¿Áþ°8¿±FYáèf ÀÅ<²[ÎÈÝ­yõ,{pz#Â¥vý­Æüpâ}'‰ÀîÎb`ñ{á²™(­ZѤ|oJ§^ƒ¿¨SYNPõ¥³jUöE¯Õ„øòîºn@×4x¾|öÛlÂRØNAõØÚõ" ué;. [Övžã¦&ÑÞÕ "]ïºfÀ0 4ºJâýq ôhÂ¥Uö^€f½ŒXB¾×°S¯ÂN(ô¶ S¸\«j°Ù©×a'&¾ï¦¦i°L •hQ¥>PGDßf*ƒ¼–SaÙîV­ªvlµ" •r¾]ÄØì-ÀŽË˨Z'N½;!ïß¾ç‰gZªô@ýz®Z'ÒëmÙprŽÒRSV[Cîwuñ3ÍXËAöUÙòîZŒ•GÐö^¥?ôahÂþ­°l7´œ&¢¶ü¾ßtˆÙ²s¹+Ù…Rµ$>6UŽÛ‚mÉž—ƒpOä˜aâñ8V¬X‘†ž¶ IDATã?~«?ÓÌuüñ'àä“OÆÿý¿ÇmóoüðA|ðÇܹüÊ«pÍ5Wã÷Ï=§œ²DDDDD»ºãÀSX¦l¦«¶Û¸à¡‡W©ÌþýÈAáÿâ/ðÄúõ¢tŽçÁ¾Ìd2x)Å+Ãât”×R«×;¶Œp'•Ú%Üþìw  g@È2d³YëMÄž‘ <σ©2óNu—BP1©úÒSå…: /g<‘€¡ë¨VfÈ*Ï"U;6ÕºT)§Ê9¨Ï2“öÛ¶‘H&‘Ïç•Ê©²4£j(÷öoÕUÒ­ tÃ@¶»ÃÃCŠÇ&ßûP»5*_ó¯çªéTÊ©ÒÞsæÌÁÆÕf‘*_ó˜ ûuª ôS¿æ)öSÅ:‘–3—Ë¡T,Á>Ó@Ëk#ß­¨HÀ<„ >¥‹—V9·TÓÍ;ùBN»3«Ø¨\¸ß師¯¾gœqÆn›ß›ÑÞ{ï¥/E¹\Þáç,ËÂ×/¾ßùö·'Œ%""""¢nm¡Ð±Ùå7=öN<ì0,ÎfEéꎃ„pçdWééAú°ÃDé`°RÁÜ”l¦eܲðí_ÿ¼,Ÿ•0ãi@Í«u$«H…çz¨U^íH~´k¤Ýñ=dóyù²4}b±2a›Æ†¦»($`š&æÚxµ(ÜDÓÏéjaMqÍtƒ„Dçc¨8 ×uÅiC„°Ï€T&v(]3l£´:»­#¬;´`Á\rÉ%Ðu###øêW¿ŠãŽ;‡v–/_ŽÇ+W®Ä'>ñ zè¡ÐukÖ¬ÁÅ_¼Ãï}÷»ßSN9a¢R©à’K.A>ŸG&“Á×¾ö5D£QÄãqÜ~ûíˆÇã[å÷Àà›ßü&^~ùe~øá¸è¢‹Éd¶û}·Ýv¾üå/cݺu€/ùËøÝï~‡‡z¨Õ7kÄb1|泟Ņ\€n¼é ?§iÎ?ÿ<øÃâñÇ5é|%""""¢-ÄøhîNªVqÓÿþ¯8ʈø9sæ ^­ÂSØ[Ú ˜Â{÷ôàœ÷¾§q„(]¡^GNaéÈ? È÷ €uÅ"uw‹ÒºŽï­Z…‡W¯ç§"DÜo{6ñ@ }¶Û,ã…|l·YFƒìo³Q ±¿ÍF›ûÛŽhk*ƒz÷Ûo?œ~úé‚§Ÿ~:>üáã¿þë¿pꩧ⬳ÎÚò¹+Vàæ›o\sÍ5X´hFGG·ûÙlgœqN9åÔj5yä‘8÷ÜsñùÏGy$žþyÜtÓxPв,¸®»U~ñxË–-ý÷Þ‹«®º Ùl^xáv¿ïþûïÇ>ðÜpà 0 ïxÇ;pÅWˆëaw÷Ù3ÎÀ­·ÞŠR©´Ã(>wæ™Ð4 ?þñû$_d‰ˆˆˆˆˆ6Ó4T;´dXÒqPl4Ðjµ:’ßX£ÓV®¿˜P]¶M×4¤²ŽïÃ.•xÐܹ8rÉ’Žd‰ˆˆˆˆhj…Ð;_…H }h|†øö¤Ói\{íµ[þÿç?ÿù¶ùiN9åì³Ï>h4X²d R©Ôd<ð@<õÔS¨ÕÆWôùÅ/~óÎ;ð«_ý W\qR©îºë.¼òÊ+ÛýŽr¹ŒÿøÇ;ý¾ýèGøÏÿüOÜpà 8ôÐCñÔSOuì÷ælñþ£ÆÈðV=ùäN?»iÓ&,[¶ x ž{öÙIçÍ€,Ñ›€®ufY_@b¨R‘'ƒ|°\"C-ÏÃ=Âٿ݉­* ÇFDDD4ÓHŸŸ&c^:d$"N§2@PuP¡ÊJ4ªéú²Yä4 ¾ç‰óSá‡! …z|axxŠJ´cÍýþ°»vú¹0 ]}7ŒV~ÒyãÓŸþô?sì±Çbîܹ[öx}}w{LÓ|ÃA±£££8餓pøá‡ã¼óÎÃ>ˆ»îºk›ÏÕëõ }_µZÅK/½„C9Çs |ðÁ–íÍèÐe‡â-û¼Gu$ ¯¯ß¹õV|êôÓÑl6·úì·ßŽU«Vá ¿‚OœúO[µƒ d‰ˆˆˆˆˆh×Ó4åɤ T¯/•0?•Âmû˜8ŸšãÀ&^RÛ¶áû>žDM8›ºÚn£Ká%dÃqîQ ¨½T™¡ õv …c«µÛJ/f¥uF¡ /QTë_µ½UëR¥íT_:wªN,ËB,ÃP?âzßr]D-KœW§Û»íyˆ˜²×z~Àè@{kºŽt*…õ¹\G¯y*†¦ç!&¬G@½½UÓ©”S¥>²Ù,6¤Ó½æuò§Òoõ{•jº¦ë"&¸e2”,@(xžÙla:ýDÏBð‡|{÷ôˆÒhþP((IÛ¾ˆð'­ÇÍ µrɤ8ÝHµŠ¾®_/‘H`¸TBR¡œ**í6RÂsÒ Cœ?]A½ c@Ót„vØÙÌŸ?6l0þ Ùjµ`Æ–?§R) ïoß×ׇ¥K—îð;W­Z…Ï|æ3èêêBµZÅQG…çž{n«Ï<öØcÃi§†»îºk«ü¤ß÷ƒüÇs :è \tÑE“­’ÝÎ¥—^²Õÿßñ½•øø)§¼áç_zñEÜs÷Ý8ûœspáL*od‰ˆˆˆˆˆhV[_*á3÷Ü•ùö(Îf³è²,ìJ‰Ç-ÇÏþ€–ç!PØGYåeµp6M××4öPÆ_ªKêÄ7 辺’ämßWªÕöV­K•¶S Ȫž“MaXAß0Ðô<¥aŠ—iw|žBPC¹½G­½}®/Û/R5 +mo]×aº.Z®ÛÑkžJÞñ}øÂz ~lŠéTÊ©º.®«Ö¿;ÜÞ*ǧÒoõ{UÓU[BÕñ}Q€Ôr]ÔÚm¥€ì㯾Š{LœÎ X ×W¡Œ€Úõ\u†¬êµRåž:00€Ñ|žâ¹"Á÷ËÜžP¡î*Zk a4»ÓÏ…¾ÍÙ5«×<ú裸îºëÆó×4\~ùåXµjV®\‰[n¹?ü0î»ï>\~ùå¸ñÆQ«ÕðÈ#ìð;ÇÆÆ°|ùr\ýõp•J—\2|÷»ß¿ÿû¿G†0MW_}5l•ßwÞ9áïÆ—A>ûì³ñè£"Pìs´µ;ï\‰eË–áƒü<ðÀ”¿Gëé陾õ&×ßßjµŠF£1ÝE!l6‹0 Q,§»($L&‹ÅÞp-š™"‘r¹§»($ ë:.\ˆµk×NwQHÁâÅ‹±fÍšé. -\¸ƒƒƒð:´Ôí(‹ÜÓg–Éårð=ŽÂï8•å˜'“NE§ËØ©t©t–i¢P(Ly^³-ŠN•1‹!“NcÓÐÐnwlÓ•N…4/Ó4Ñ?g6lذÛÛlK'µÇk¿vÇc›L^3=ÝÜyó0:2W!¨ç‡!Úü 1mæÍ›‡|>¶Â€1Ú¹f³)^b6‹!!ÜÒd&ºþúëqÝu×á…^˜î¢Ðëp†,‘@†hth&í–ëÂe»Í:a âyʳÌhz˜aˆÛmVb»ÍN-ÏCÃu•²D´û™?>R©ƒ±3²DDDDDDDDDDDDD³Ø¥—^Š lµ„1Í ÈÍbçž{îtv@¾;5M²DDDDDDDDDDDDDDS„KÑŒ‘I¥&÷aˆz½.J±íÉçKoz¥Je»Ï²DDDDDDDDDDDDDDS„Y"""""""""""""¢)€,Ña@–ˆˆˆˆˆˆˆˆˆˆˆˆˆhŠ0 KDDDDDDDDDDDD$”Éd¦»4K0 KDDDDDDDDDDDD´Ùl7ýÛ¿âñ8.¾ä’¦¹÷þûqü 'lõwÿrÞyØÿý§¤Œ41øÀñß½m»ÿ¶âŽïmùs<‘ÀåW^…}öÛoRù1 KDDDDDDDDDDDD$Ðh4ðéO}j§Ÿ+ð¡}½}}¢ï¿øÒKU‹F;±xñbpШV«;üœeY8÷Ëçáö+ðÒ /L*OsR©‰ˆˆˆˆˆˆˆˆˆˆˆˆf¹9sæà²Ë.ƒ®ëÍçñÍË.ƒëºøËcŽÁ 'œ€J¥‚Õ«Woù|,ÃMßúN>ñDÀ‰'„ƒ>º®cݺu¸rùr€çy¸í¶ÛpæYgá_¾ô¥mò}Ç;߉|ä#[å{ì±Çâío;.úú×ñÄOà¾{ïíL%¼ D£QœzÚiø×o|ÿzÅò7üœ¦iøü¾ˆŸ<ü0~÷Äo'/gÈÑnCSH³ç^{á‹_øÎüÜç°ipÿßqÇ!—ËáN<gy&ÎþâQ.—ß0ý÷ïº gy&>wÆèëëÃüùó–mã~òÀ{ß÷¾­Ò¤Óiœp Ûä{ß}÷¡R©àüóÎc0v;퓟ķߎr¹ ]{ã3åÿ~: iøÙÏ~ºKòå Y""""""""""""š1ô0„;ýœ ž¾kævuuá—]¶åÿÿ÷ÿûî·ž~ê)4 À¯{ ïû³ *0>›ò£÷wØ{É4 ì¹çžH¥RãÇòZù®ºòJ,¿òJüö7¿Ù’î­o}+,\¸M¾45ŽzÏ{0:2ŠgŸyf§ŸÆÛ–.žûïŸ~Òy3 »–©oé !Bh‚q¶eÀ¶ 4Ä9©3 ¦aˆÓ…( Âq|q^»»ˆ-ïvÒsk3×õ„âd³‚¡k0͉ŸËÛDÄ6a[&v0èå µOžˆˆˆˆˆˆˆˆˆˆˆÄþ¶¸É dƒ0Ä}™¹È›‘­ÿAá%p!ŸÇÙ_üâVwĻޅ øS9|û1÷}4æÌ™³eIâ×X7ÆÝßÿ>>ýÏÿŒàµïÑ4 ¿î9|ý¢‹Äå%¹¥KÆ^{ï…wq8 ×Óƒk®¿ç|á h6›[}öžïÏ<ó ¾xö98ësg Q¯O*ïŽd»üë9Ç‹Óm*aþœŒ8ݺ ,šŸ§+–èËu‰Ó¹žK ŠD/T‹YCYÔlÝÆ1,š—•0† ÌŸÓ-K`¬TG6“¥i·]˜¦@xlƒÃ%Ìí—·÷ÚcØCZ'6”1Зžðç-Ë4-X–,¸]ª4Ñ—ë·÷š y,žß#J¯0Ð'¯Ë±RÙL\”Æu}q}òúßlh´ŒooÃ0a:^yuXÜ4 ­ˆoâÕF ]ñ¨( Œª0LC|žKut û©ièxyí( ¥š(]*=Ó ÕöPo¶'üyÛ¶‘Éd‰Ð y†±˜xħóý†!˜ãº>*õ–8¯Ð¡)[à‡Ju’ˆEÈûª„®ëèééAZC½)¯ÕcS­ËT"*¾~µÚ~ýôZq^ªús]èÍ%Åé‚0ÜáÒ+NÓ4ÌÈ"a·Ç;º€êuÁ÷C 퉘HÆ";ÿàŸñ¼¦)ëßž \mîüƒ&BèºüØTêdî@*¥J """"""¢Ùo"ÁXÐ5 ßÛ6 « ×Ó§ÝÆàà €ñÎêÕ«ñ‰ÓNC4E«Õ¡‡¶Ý´]]]ôööâ€Øîçî¹ûn\wýõˆÇÇß¿ÿþùçñ¹³ÎÂܹs·Ê·ÝnÃ4Í-¦]ãê+·Þ3öæ[¾Ï~úÓoøù?¾ü2|à|泟Åe—^:©¼;m´\\ÛÏÅéT=­¶‡hD~ˆõ†#zy¹Y€º`c®§µj º.ŸEÚrPC…ï‡Èfâ6†‰X,†µë3èé– €¦a¬\_»Àñ|Ø‚6Àxà%›Il5bn"T@@¾XGO·,MC±ÔP ~ɲÑN§1'k#'hïÍ”Ž ju©ëÆÊ ñ}?“Šã´Ç•ÝÃ7”‹Úâ:±Lµ†üá»Rk!•” I¥Ó(ŽõŠÏ“j½®„üÇO¾Ø÷oŒ “œTŸ¡Bt§ð…ý»Xi¢;%¿žŽ5Л•ÕI_oîÅ·<"Έˆˆˆˆˆh¦)ê&ºƒ:vTõ]êzòÉ'qà 7_1ôúë¯Ç³Ï<ƒ•wÜ«¯¹¥R O=õkt²N:œÛÛ; ÿôß̧͒rªèì¹ìz²YQ³I£5sØ#‘œÀÂH¡:ÝE!]×M4wûv)‰Óhš¦lÄ[¨²ãÝØ4 Ãlóû?ŒàÀ½{ð¡c–ŠÓª¬èPo´‘ˆËŠuä„3àMÓ€¡ëø—+îçGDDDDDDD4t< KDDD´;P‰†a'ÏÈ%Ú™jÃÁ ÿõèøÔU!•TgD»žK8“=•Œâ+Ÿ=ç~òq~µF Iá~îºÜø_bLaV:Ñö0 KDDDD4Ë…!0R¨nw›Ùnh´‚«¾óS$ö(ö‚@¼—øûØÿ7ËðØ“kdy),5ëÉáå5>Ö®ç’ÅDDDDDDD»3d‰ˆˆˆˆhÆ Â¿ûý«Jûm‡áø^ÑÃ…*N>á/NÅEé*Õ&R]1QšD"cŽØÝ)Y:X?XÄ‚¹Ý¢4†®ãºïþ O<Ç=ýˆˆˆˆˆˆˆ:‰Y"""""šÑ\/èØ~î/üaËoù„ÂuÉý „¡Ë¢¿}ýýh7ëÐ _ʼíxˆØ²Ÿsûí5ŸúØQ(VdË1Wj-¤’²¥Ÿ`8_†eYâºÌÕГMŠÒ˜¦~ò,ž|žÁf""""""šy%"""""zç)w&33b±ˆV«Ù‘ìÖm,âÕÁ¢xÖ°çùj3”¤’òÙ¿í¶ƒHÄ¥yËâ>÷þ%""""ÚM”*•I¥oµä[ôgÒù½d‰ˆˆˆˆˆ¦•0Bª¨Ñr°ê…õÐ:”Ÿ¦†!䪬5„!–,ê•çEDDDD“ˆÙ°,…çC!:õ˜=žÂv)édn; '¢OM¡v@¹Ò™¤D»;d‰ˆˆˆˆˆÞ$|?Äøk•ÎèÔRÓ›FÊèKãªó>,J†@®;1þ‡ ²lc¥~öøK¨ÖÛ¢üZŽ‹¨m‰Ò€ëz°,ùÏ÷À ²|¾çÃP˜í8>l[ž®í¸ˆ(Ô‰ãz°uOÄa&*•þ)Ïk3åcS¬Kß `˜²öV9GõsRÚlÛF"‘ÀÈh,Sž_†Ð„oÇ]ÏSÊK½½=ØÂ%èµÕ ‚ €®ËÛ[ÚLÓ@wwæE•êDµ  „&Ü>@uÇqa+µ·Z:×óa Ë©RýýýX<ÇìlP¼ÆªœÏêí­ÖOUëDÚzzzP*fáùž8¯ÅósØoï9ÙóáúÁ"Ìí¥Ñ5 \k¡;¥€FÓA<&[A¥Zo£+ç58RÆÜ¾´8Ýú¡ÌɈÒÄb1 ŽÑÝ%ßDE¾XGOwB”Æõ}œùõïOQ‰ˆÞ\%"""""¢YmÍú<.½é¿å/«Ãµz[¢îÎdIE°ßâôtËöÿ­Ö[èJÈ_¸Õm$âòŠ*A Õ@[­ÙF2&/£j4Û.b‘‰¿äŽE£Ð õ”üŸ4¯ÍªºâòcS­K•¶S |©ž“Òö¶- ÑX ÃE,*ÏO%`£:pB¹½ëm$*ííù>L…• êÍ6‚sÒ0 tuu!ôJý»ÑrÊ/€Z{«ìɨ·[­ÞBR¡NTÊé> ]ÖÞÙl ðJõ¯|ž_›©W•ïqŠí­z]^‡ÒéR±ñç©fËÁm÷þž/D§rNjP,7$ãà¶ðƒ†p€0¡´]¥Xò:éŸÓ‘‘<Â@öL©Jip‡JƒÑv1 KDDDDDD³šãúøýË›”V¥ó…3Brµ}¬zn-¤³U^&@„ÐÒ©,§2£P?¶NÕI*•‚iš›ò¼6ët¨´Ê9t®N¢Ñ(R©4†††Ôúä«Ua}ô™ÜÞ¦i¢¿¿¯®ßÐÙkvßöV)§J},\¸k×®íè5÷¸mIÛ{îܹçÉgÈz^€Z£Ý± ›èè:Â3œF‘Ï—ÑnËV]!¢Ù‰Y""""""šõ¤KíM†ë¨TjË&Ï L˜¦‰B±>ÝE!hÔ‡cåÆt…LÓ„m¢Èv›uRÝ-ö·Y(šh¢PjÀuÝé.Ê0K»¯îîn‹Åé.Í`3w·h""""""""""""¢,㪫®šîbÐñÇŸ€{ï½o»ÿöÀÜòçD"ûÖÍxëL*?d‰ˆˆˆˆˆˆˆˆˆˆˆˆ4 œ|òÉSöýW_}õ”}÷›ÕÞ{ï¥/E¹\Þáç,ËÂ×/¾ßùö·ñûçž›Tž\²˜ˆˆˆˆˆˆˆˆˆˆˆˆÞÔÞõ®wᤓNÂ%—\‚|>x<Žk®¹Ï?ÿ<ößX–…Ë/¿§žz*2™ †‡‡qÎ9ç ‹aÅŠ8þøãÇqà 7àÅ_Ä¢E‹N§±|ùr<ñÄ€O|â8ôÐC¡ë:Ö¬Yƒ‹/¾x‡i>ò‘à°ÃÃòåËñøãcåÊ•Ûýš¸X,†Ï|ö³¸ð‚ pÃ7½áç4MÃùç_€øC<þø¯&/gÈÑŒai@Æ4vú_\ßua®_þò—¸÷Þ{qî¹çnù»ƒ>÷ÜsN=õT<òÈ#øêW¿Š³Ï>'Ÿ|2LÓÄÛßþöm¾ç ƒÂÝwßÓO?_ûÚ×ðÉO~rË¿­X±§vN=õTô÷÷cÑ¢E;Lsçw¢R©à¬³ÎÂÊ•+wø41Ÿ=ã Üzë­(•JÐwpþ|îÌ3¡i~üã‡wI¾œ!KDDDDDDDDDDDD3Æ}ï‹9{§ŸóÃ'=ó2^h´vI¾¿øÅ/pÞyçmùÿááa¬Y³°~ýz<óÌ3h·Û€ 6 —ËmóÃÃÃX½z5à•W^Aoo/€ñ—§œr öÙg4 ,Y²©T £££o˜æÏ½ÑwÐļÿè£12<‚UO>¹ÓÏnÚ´ Ë–-Èçž}vÒy3 KDDDDDDDDDDDD3ÆD‚±`hú#Ö. Èþ¹ÍÁ×Í\×ÝišVkûe9öØc1wî\œqÆ€k¯½v§i$ßA;wè²Cñ–}Þ‚#:Ð×ׇïÜz+>uúéh6›[}öŽÛoǪU«pá…_Á'Ný'ÔëõIåÍ€,Íl´°W<ºÓÏ5<ÛÛI5Mç†!Ž:ê(<÷Üsâ´‘J¥044`<¸téÒ ¥3 Ñh­VKù;hÜ¥—^²Õÿßñ½•øø)§¼áç_zñEÜs÷Ý8ûœspáL*od‰ˆˆˆˆˆˆˆˆˆˆˆhÆøÈÓ«;žçᇎãŽ;—\rÉÎ?¬àG?ú.¿ürÜxã¨Õjxä‘G&”nåÊ•¸å–[ððÃã¾ûîSúRwç+±lÙ2|ðƒƒøò÷h===á., ô÷÷£Z­¢ÑhLwQH ›Í" C‹Åé. $“IÄb1ŒŽŽNwQH ‰ —Ëapppº‹Bº®cáÂ…X»vít…,^¼xËÞ(4{,\¸ƒƒƒð®+×5sÎûsÞïY2sfÞó9G’Ôºuk%&&Ö¬‹U·nÝ$I]ºvUyy¹J|lìÁ{s^I×È#jþÎæåi䈗4c/Èÿ˜Î?äsÎN:)''§æzïÞ½Õ¹sgÍ›7¯fÙ§Ÿ~êsÏ/î¸C¹9¹Úù¯Õ›­ääd%ö꥽{öøœ›†,šŒ†4c%ÉbµªE«8¿4d³²²4qâD¹\.IçYûõ×_kÒ¤I>oMCßä¾êqmÝvûm’¤¸¸8-YºT®²²‹gZ¯Z¹R;wîÔÔ©Ó44å*))ñ)7ç@“qö»c Š«,/UÁ™,¿äÌÎÎV§NÔ³gOIÒž={”œœ¬øøøš˜ÐÐPI’Õj­¹Œ+GZÚLý~Èš¿ÜÜ\ý~ÈKš±:xPkß_&Nô973dÐd¬˜ôhPò>ÿüóZ¹r¥$éûï¿×Ô©S5kÖ,IçgÌΞ=[;wîÔêÕ«õÆo(##CË–- J­hkÖ¬Vrr²î¹ç^mØð¡×Û¡! €fÃ0 Óc<233Õ¯_¿šeÛ¶mÓ¶mÛ.‰]´h‘-ZäS¾A ¬uù=ýï¾èúĉ|ÎÅ!‹ @hÈ@€Ð€¡! BCÄì€ ¢##}_VV¦‚‚Scl6›ÏyüÂÂZ—3C„†, Y²ÀeDGG»\ÁhÈàªf±X´lùòZ×………)uæLSÛs:unÁ׿ÿ=Z¶üíZ×­XõnÍå°ðpÍ~åU]{ýõ>å£! €æÃ0¼æñxj]^ZZª?^s=5-Í«í£ièÒ¥‹{÷RQQÑeãìv»žžüŒV®X¡Cø”“†,®jaN§,‹F£ÙééúËüùêqíµ’.žízß}÷©OŸ>š>c†îûïÿ–$=úÛß*ý•Wôêœ93vlÐnꪔÇÓë ÈîpÔg†ÆRŸddè«_úœ×æó€+Xii©âããõì”):~ì˜:wé¢)S¦èøÃEqëׯ×#>ª)Ï>^999ªªª v)0©C‡ÊËËSEEE°Ki’¢##}_^^®S&¿S U|ûö>åòëø¬hiä:àªAC„†, Y4†a~ŒÇãÿ:€£! b vÀù……>¯®®6?Æåò9/PfÈ@€Ð€¡! BC„†, Y\Õºuëf*>,,Lk×® P5´î׺uëk]·a㦚ËáááZ¸h±nHLô) YàßæÌ™ì@Ý»wWÒMI*((¸lœÝn׌ԙZòæ›Ú·w¯O9iÈàªæñx$I>ø úõë§ôôt 8P’të­·jáÂ…Z¼x±RSSåp8‚Y*|àt:õÄÈ‘z%=]öË<ކahÊ”gµiãFmß¾Íç¼4dÐdx «Ü¶ðzÿ<ÖÿåüwCvÍš5*,,ÔØ±cµzõjEGGkРA>|¸†ªS§Néð[^4®‘£FiéÒ¥ÊÏÏ—ÅRw›tô˜12 C›7gø%¯Í/[ü ¬ÏÓRhËzã<·BwÍ‘µäTÀjéÝ»·:wî¬yóæÕ,ûôÓO–ó‹;îPnN®vþë_õÆfgg+99Y‰½ziïž=>ç¦! €¦£ÍXI2 ‹\eeeÅ®Z¹R;wîÔÔ©Ó44å*))ñ)7‡,@“a”œnPœ§ºBFù÷~ÏoµZ*IÚ³g’““_³þÂ:\YÒÒfê÷C†Ôüåææê÷C†\ÒŒ½àÐÁƒZûþûš0q¢Ï¹™! €&ùó¥FÏyá²’´zõj½ñÆÊÈÈвeË4uêTÍš5KÒù³³gÏÖ¡C‡½F4¾5kV+99Y÷Üs¯6løÐëíÐÀUíøñãŠŽŽ–$-Z´H‹-ªY·mÛ6mÛ¶í’1 h´úàƒXëò{úß}Ñõ‰'øœ‹C@€Ð€¡! BC͆a¦Çx<žTœGCÄì€ ¢##}_YY©sçΙcµZ}Î äÖºœ² 4dÐ|xqYqY Y² 4dpU3,Íí5õ¼á†`—‚Fпÿ=Z¶üíZ×­XõnÍå°ðpÍ~åU]{ýõ>å£! €«Zll¬–-]ªýûö»X—.]”Ø»—ŠŠŠ.g·Ûõôäg´rÅ :pÀ§œ4dÐl^Œ)..Öÿ}ñ…ßkAÓª”ÇÓë ÈîpÔg†ÆRŸddè«_úœ—†,®j¥¥¥Á.à±aôjåJÈbÔݺÿÓðá’ahëÖ-~ÉKCM†ÍãQ„ÇUï_ˆÇí·œŽËÌ–DópûÏ®3¹g´g÷îzcsrrÔ©s']׳§_rÛü²ÀR+¾U+ÃUoœË#¥9:è„%Ä眭ZµRxD„JŠ‹}Þ𦤤›Ô­{7ýä§·H’bbc5wþ|M?^eeeÅ®}ï=íÞ½[ON˜¨±£G©´¤Ä§ÜÌ@“Ñf¬$Y ©¥§Ú/9‹‹‹5nÜ8¿l MÓœWÒ5rĈš¿³yy9bÄ%ÍØ 2Ѧ ôÄÈ‘>ç¦! €&#KöÅ•{ åùé`°ÅÅÅr„„èî»ïöËöÐ<|°~ŽÝyç]>m‡C É˜Ò1(yŸ™4)(yCÿø‡Z—?2è¡‹®OnšÏ¹˜! BCW7'Ø £! €æÃ0‚]p² 4d @lÁ.¸ ¿°Ð§ñn·Ûô—Ûís^ .Ì€¡! BC„†, Y²@………iíÚµÁ.>0à~­[·¾Öu6nª¹®…‹ë†ÄDŸòÑLðx<Á.^êÞ½»’nJRAAÁeãìv»f¤ÎÔ’7ßÔ¾½{}Êiói4p…³Ûíš?¾Ž9¢[n¹EÓ§OWtt´† "Ç£ÂÂBÍœ9Syyy’$‹Å¢I“&)!!A¡¡¡zá…tàÀIÒСCÕ·o_Y,;vL©©©Á¼iø§Ó©'FŽÔÔgŸÕ‚×^¯3Î0 M™ò¬6mܨíÛ·ùœ—²¸ªUWW+99YûöíÓÀõÝwßiÔ¨Q5j”RRR´nÝ:=ýôÓ5ñ z÷Ýw5lØ0MŸ>]Ï=÷\ͺ+Vè±ÇSJJŠÚ´i£N:ã&¡#GÒÒ¥K•ŸŸ/‹¥î6éè1cd†6oÎðK^fȠɰۤgýs +ª<*-÷ß¡ƒ ´yófIR¯^½´k×.K’>ûì3=óÌ35±¹¹¹ÊÌÌ”$effÊn·«E‹*..Ö!Ctíµ×ª´´T×\s"##ýV#¼÷‹;îPnN®vþë_õÆfgg+99Y‰½ziïž=>ç¦! €&㣗;«]Œ½Þ8—Ë£AÓ¾Õ¾c•~É[RRRsÙf³É0Œ:cÿsar»Ýºûî»Õ¾}{5J’4oÞ<¿ÔßõMî«×öÐm·ß&IŠ‹‹Ó’¥Kõøðá*++»(vÕʕڹs§¦N¦¡)¼è¹á Y €&£!ÍXI²Z µmÕ°X³vîÜ©>}ú¨E‹’¤Ûo¿]{÷î­YߺukõèÑC’Ô½{w•——«¤¤D‘‘‘:}ú´¤ó ¿¤¤¤€ÔóÒÒfê÷C†Ôüåææê÷C†\ÒŒ½àÐÁƒZûþûš0q¢Ï¹™! €&ã›SêRo\I¹K's«RÃ÷߯ôôtÍŸ?_•••*,,ÔÌ™3kÖoß¾]ƒ R‡äp8jÎ!û÷¿ÿ]³gÏÖk¯½¦ââbýãÿH}hkÖ¬Vrr²î¹ç^mØð¡×Û¡! €&ã×O}Ûè9= pѲÏ>ûLŸ}öÙ%±¥¥¥züñÇkÝN~~¾RRRR#ükÐCk]~Oÿ»/º>qâŸsqÈb² 4d @hÈ@€Ð@³a†é1'•çÙ‚]pAtd¤Oã].—Ξ=kjŒÅbñ9/_XXërfÈ ùðb†¬˜!‹¢! €fËv¬hÇ"hÈ@€Ð€¡! ˜ìp¡! 4PXX˜RgÎ vðAÿþ÷hÙò·k]·bÕ»5—ÃÂÃ5û•Wuíõ×û”†,ð©iiu®+--ÕˆÇoÄjàO]ºtQbï^***ºlœÝn×Ó“ŸÑÊ+tèÀŸrÚ| \áBCCõÚÂ…zÿ½÷ætªOŸ>š>c†vìØ¡Œ?Ö´çŸ×ÑÌLõûñõ—¹s5zìXýîÑGåt:•6k–>¬×^+»Í¦ùù‹ÿö·ŠŠŒTî™3z~Ú4y<ž`ßDèüãœòØczqÖ,½ørzq†ahÜø'õIF†¾Úñ¥ÏyiÈ é°Ød±‡ÖæqUÉS]á—”åååþ§?Én·«ªªJ<ú¨¦<óŒ$Éét*))I߸Q _]N§ó¢±½z÷Ö+ééZ0¾>ô&<õ”KIQee¥¦Ï˜¡o¼Q»víòKðÍcÆiÕÊ•*((Å0êŒûÓðá’ahëÖ-~ÉKCMFü¯§ËSoœÇíRödzTyö„Ï9ív»:wî¬ãÇ׺¾°°P[·n­uÝ™3gtâÄù¾ûî;íß·O•••’¤¬¬,µlÕÊçúà»ÛþsÉ=£=»w×›““£“’t]Ïž:¸¿Ï¹9‡,šŒ†4c%ɰXeu¶ôKN—Ë¥±ãÆé×÷ÝWëúÒÒÒ:ÇVT\ç¦! €&£2?«AqîªrUŸñKN·Û­ysçªoß¾’$›Í¦¿lMÜWÒ5rĈš¿³yy9b„ÊÊÊjÏ÷x<Ê4ùý†aêÖ¥‹Oyü:>+rÈb² 4d @hÈ@€Ø‚]pA~a¡Oã=OPòua†, Y4†a˜ãí¬Z !hÈ@€Ð€¡! BC¸Œ-[¶hÅŠzûí·õî»ïjĈ 3hР‹–¥¦¦ªW¯^¦r6L«W¯Ö»ï¾«+V(>>þ¢šV¬X¡%K–())I’¦µkךÊqµ0à~­[·¾Öu6nª¹®…‹ë†ÄDŸòÙ| 43sæÌѨQ£.ZöÈ#H’l6›V¬X¡ŒŒ 9r¤Îmäååéá‡Ö–-[”““ãUîÞ½{+99Y?ü°\.—¢¢¢T\\|IM‰‰‰zñÅu÷ÝwK’<Oƒó]mºwﮤ›’TPPpÙ8»Ý®©3µäÍ7µoï^Ÿr2CW5‹Å¢ÔÔT9=øàƒêׯŸÒÓÓ5pàÀ‹â ÃPÛ¶mår¹”››«·ß~[:uªY?yòdýò—¿”$UUUéµ×^Ó¤I“jÍyë­·jáÂ…Z¼xq¹-–ó­<—Ë%I*((¨¹üC{÷îUXX˜l6[Íí™4i’^ýu-]ºT×_½ïwR3àt:õÄÈ‘z%=]v‡£Î8Ã04eʳڴq£¶oßæs^²¸ª¹Ýn:uJZµj•bcckÖ-[¶Liii ÓSO=U³<77W™™™’¤ÌÌLÙívµhÑÂË{§yøÅw(7'W;ÿõ¯zc³³³Õµ[W%š<ßo]8‡,šŒŸö|P¡ŽˆzãÜ·¾<üŠÊÎúœÓãñhĈ Š­¬¬ÔŽ;týõ×kÛ¶m:tè~ô£é®»îÒ¦M›.‰?}ú´V®\©ñãÇ×nØ0 }ýõ×uÎø?}óÍ7JMMÕèÑ£õ«_ýJË—/—$ýîw¿«5Þ0ŒK®»Ýîåj®ú&÷Uk{è¶Ûo“$ÅÅÅiÉÒ¥z|øp•••]»jåJíܹSS§NÓД?ª¤¤Ä§ÜÌ@“Ñf¬$Y ‹BìáþÍ*éüá‡/\þOv»]ýúõÓáÇ%I~ø¡îºë.õîÝ[_|ñE­cV­Z¥N:©gÏž’¤={ö(99Yñññ—Í%«ÕZ«3gÎÔ{;Z·n­=zH’ºwï®òòrŸ›ŠWº´´™úý!5¹¹¹úý!—4c/8tð Ö¾ÿ¾&LœèsnfÈ É(.;§gËzãª]•*¯,ò[Þ+VhöìÙÚ¹s§V¯^­7ÞxCZ¶l™¤óç5 C!!!úä“OôùçŸK’¶mÛ¦ &èþç꜅êñxôüóÏkåÊ•’¤ï¿ÿ^S§NÕ¬Y³$ŸÁZ[îãÇëÏþ³*++%I_|ñEÍyi/gûöí4h:tè ‡ÃÁ9d½´fÍj%''ëž{îÕ† z½#66ÖãǺ`B›6mTTT¤ÒÒÒ`—Zµj%Ç£sçλ˜!§ÓÙ _¡é QLLŒ²²²‚] L°X,JHHÐñãǃ] ¼Ð¥K;v,ØeÀ¤„„eee]ö<7hzÚµk§sçÎÕœ[W†˜˜UUU©°°0Ø¥À„¨¨(Ùl6=ëû¡ìÐxBCCÕ²eKegg»˜`³ÙÔ®];û¬Öx»Ý®§'?£•+VøÔŒ•hÈh抋‹U\\,‹Å¢øŽÕ¾C¼Ž[Uk¬a7þI}’‘¡¯v|ésn²h2 «!›ÃRoœËå‘»ÒÝ¡¹¸®gO¥¤ Ull¬>þè#:uªÖ¸? .†¶nÝâ—¼4dÐdô}üZ…F…Ôçv{´kÉg—5BUhî߯ñcÇÈb±è‰Q£uwÿþÚ¸aÃ%q999º1)I×õ쩃û÷ûœ·þŸ¤!ÍXI²X …´°×ºÎð"¯Ç‹1¸2¹Ýn}ù_¨sç.µ®_ûÞ{šýÒK=f¬ÂÂÃ}ÎGCMFÉ™†Íx­®t©,¿"ÀÕ ¹ˆŠŽ–aœoÕ†¡~?¾YG®3>óÈmÚ°AOŒésnY €&ã«…u7ÉÌ0$É9¯Ïùqh–õÀƒUQY)«ahÏÞ=Ú¼9ã²c>X¿N7&%éÎ;ïRFÆÇ^ç¦!  YûççŸëŸŸ^oÜ#ƒºèúôç¦ùœ›C@€Ð€¡! BC„†,ˆ-Øäú¼ ÇczLAQ‘ Ãð97ðŸ˜! BC„†, Y²šµ¶mÛiúôúËüZ´ø¯š:ušBBB.‰Û°qSÍåððp-\´X7$&ú”›†,šÃ0Lñx<^åš3gŽWãиJJеdÉýyÄãzlhŠÜ·~ö³ŸÕo·Û5#u¦–¼ù¦öíÝëSn›O£€fÀáp¨ººZO>ù¤Ú´i£„„ÅÄÄhùòåZºt©n½õV Ð[o½¥èèh 4HÇ—ÛíÖðáÃõÀèwÞQJJŠÆŽìòщ½zéÏ~Bqqqúðƒôí·ßÖ7z̆¡Í›3ü’—†,š ‹Í.{xx½q®ÊJU—•ú-ouuµ‡\.×ùí»\ª¬¬”ÛíVïÞ½Õ¹sgÍ›7¯&þÓO?õ[n4޽{öhØŸ“ÅbÑĉOiÀ€zÿý÷/‰ËÎÎVrr²{õÒÞ={|ÎKCMƽo­Ux\ÛzãÜ.—>~bˆÎ>à—¼ëׯ—ÍfÓàÁƒ•žž.·Û­ H:Û¯¿þZ“&MòK.—ÛíÖÿnû_õëÛ¯Öõ«V®ÔÎ;5uê4 Mù£JJJ|Êgñi4àG iÆJ’ÅjUXlœßò†„„Èív+66V“'OÖøñãõñÇK’öìÙ£äädÅÇÇ×憆J’¬VkÍe4]-[¶”a’Î7ØúÓŸéÀº›ù‡ÔÚ÷ßׄ‰}ÎÍ Y4ùÇ*ºs×zãªÊJUr:Ëoy{ôè¡'NH’Þxã y<†¡éÓ§ëÀš:uªfÍš%é|CoöìÙÚ¹s§V¯^­7ÞxCZ¶l™ßêݘ”¤Á VyE…¬‹vîÚ©7\vÌš5«•œœ¬{î¹W6|èun²h26¥ JÞ={ö(--M/¿ü²vîÜ)IJNNÖÃ?¬gŸ}VÛ¶mÓ¶mÛ.·hÑ"-Z´¨±Ë…I[·lÑÖ-[ê»§ÿÝ]Ÿ8q‚Ϲ9d1 )**JEEE5×{ôè¡Ó§O±"4Ì$-X°@ãÇWii©l6›òòòôÒK/»,\áhÈ’öï߯aÆ» 43²„†,‡,@“éó6òóóåv»M‰ŒˆÍFë ÞË/,¬u93d @hÈ@€Ð€¡! BC„†,à%§Ó©eË—» Ô#.®žš4Y³^š­—_£ñ&Êáp\·bÕ»5—ÃÂÃ5û•Wuíõ×û”›†,šË1žZ–¥¦¥ùZ šˆÒÒ­|ç=õäx=J[?¾ùæ:ãív»žžüŒV®X¡Cø”ÛæÓh ˜4y²:%$hîܹ:|èî»ï>õéÓGÓgÌÐŽ;´~Ý:Ýü“ŸèÁ”ÅbÑ™¼<½ô Á. T\\¬ââbY,Åwì¨öâuüتZc ÃиñO꓌ }µãKŸsÓ@“a³YZo\UU•*Ê*k_i˜Ÿ#;sÆ ]Ó£‡¦L™¢?þáZ¿~½yôQMyæIRTT”î¿ÿ~=9~¼Ün·~ÿ‡?è×÷ݧM7šÎ…ฮgO¥¤ Ull¬>þè#:uªÖ¸? .†¶nÝâ—¼4dÐd<»äIµŒkYoœËåÒË£èäáÚ›jÞ8~ì˜lv»"""T\\|Ѻn¸A4ë³bÿùÏú-7ïàþý?vŒ,‹ž5Zw÷ï¯6\—““£“’t]Ïž:¸¿ÏyiÈ ÉhH3V’¬V«¢c£üÚ•$‹Å"çÒ3ʆ¡}{÷jÆôé-w:~ÍÀs»Ýúòÿ¾ÐM7ý¨Öõkß{O»wïÖ“&jìèQ*-)ñ)ŸÅ§Ñ€eŸ8Ý ¸Š² Í>ë×Ü]ºvUyy¹JþÝ€³Ùl ‘$íÛ¿_7&%©}ûö5ñÖ¡é‹ŠŽ–ñïCY†¡~?¾YG®3>óÈmÚ°AOŒésnfȠɘùØ+AÉûô¤IêÔ©“^üÁ!‰×­]«¹óæiË–-Zµr¥^œ5KS¦N•$’æÏŸ¯oŽ J½0'11Q<8P••²†öìݣ͛3.;æƒõëtcR’î¼ó.ed|ìun²¸ê¥Íœ)»Ý~Ѳ·–-Ó[Ë–Õ\ÿòË/õå—_^2öw>ðúà›~þ¹þùùçõÆ=2è¡‹®OnšÏ¹9d1 Y² 4dЬ^Œñø½ à<² ¶`\_Xèó6\n·é1EÅŲZ­>çþ ÙZX-V†“Ù=25ÞnµËfi܇ÀbXd±x11Úäm»0¦Ú]m>W3æñxd·Ù½(¯Ž¯àr¹äi¦Y0 CVKÃßíVûùÿ9«wÿsÕ®æû\öê5ÏËç¤Çã‘Ëí2?ÐKùš×Ø·Í[^¿Ç™ÉaµÊfµÉj±6ßûÄËÿ·Û-·Çü‡\Êëÿo/\)ÿßhšµhµXuCBOÓãÊ*Ëät8M+©(UxH˜éq†a‘ÓjzœÛí6õÅ`Ë–-•_˜¯’ÒÓ¹J+JæÅms»ÝŠpF˜W媖Ýd#«ÚíReU…é\e•å^ÝÿÞ>Þå•å 5‘/2*JGù-òe5ùEpµ«Z‘a‘fKôú>)(-4ý¸IReu•&Ç.·Ûôý!™¿ÿ˜¯…‰ç²3,L‡C¹a9 ±‡˜ÎW\^"‹É†M•«Jv«ù|iE™ÂBï5Ïb±*Ôä}âöxLßÒùç²ÇD3Êáp(**JNÓ«Û&ynzTµ«Útó¾ÊU¥ªê*Ó¹ýñ6¬ u˜ÿ0•ÃjU\\œ"Ür{Ì7±¼½mÞÞ—v›Ýôÿª7Ïéüû·7¼~«*W¨ÝÄk¬a¨]»v w‡›þ¯¬®”Ãæ0YaãïÓT»«Mÿ ®ÚU­ÊêJÓ¹sŸ¦MÛ¶Š0Âe3Ì?/½y÷f_Aòþñöv\Sß§‰‰UNHŽl2ÿëkoŸ_Õn—l&~Ô&]9û4Õ• 1ù:äñxLÿ('**J%å%ªneþ{ÞÞ6o?{ó~åý{\#?ÞU¦öë#""dµZUТ à¹.hì}¯>·{ùx7Ö÷4޵hÑB-,æöiþÍ›Ï-ÞîÓ\·ï’ù÷›Í¦V11rT;å{𠨧¹˜7÷Gûvd+·zuÿ{ÿÇ>Í2»OצZ‡ÆÊUmþó·éÏŒÿÆ>Í¥¼¹OâââtÚ‘#‹'°?œ¿À›}·Ç­½'ö¨"àêÒ¨ Y§#TþƒMûîl–:Ä´7=îxî uŽëdzÜ©3§Ô"Ü|ÓÌ싼ÓéT~Q¾â¢â$¹YŒßæ~«„¸³%êXî µŠhiz\aY¡"æî“ªêJÅFµ6}Û²¿ÏV»VíL‘¼¼Íæs„„HŠK‹MH;Wr¾‰kò.Ñés§Õ¶e[sƒ<ç·Ž±ñæÆI:[|N1&Ÿ'Þ~ˆñöñþ6÷¤¢"¢o·Ûd³ÙtòôÉóÏK CrXCL7±òK Þð/8™wÊ«ÇíDî uòâ໳ß)ÂÙÂÔÛ-Ë/« K Õ1¶£ÔÀ™Û«U‡CÛôêÿûDî E{ñšçÍÎwYE™Ú¶jkú5ÏÛÇÛ«×ÞÞ~@Ë/ÊW§6æß¿½}óæý#<<\= M¹q¶ð¬b"cL‘Ÿ¦¸¬Èôk^UU¥b£ÍïÓd}Ÿ­ö´O®cYÇÔ&*Ît>o¾x>[tN1-ÌßÿÞ>Þßž9©„ÖMkêû4¡¡¡ÊÌÊT‡VLçûîl¶:Ę~yó%Ø•²Os¦0O­#cMñæËj‡Ã¡œüµ 3ÿ?àíëùwg¿S‡óÏ“’ò…‡šûqZQY‘Z˜|”yŸFRnAîùÏÒ dw8dHª¬4ÿ›Ü‚3Š3ùBjü}o>·{ó‘ï{«Õ*»Ý®ãÙÇÍ&–w o÷iNä~«NÞ¼ÇåR‚wAI¡¢L~wåm#Äì>ÅbQHh¨´>Ð(ßÓ\À>Íż٧ ˆÐ7­4ê÷rìÓ\*¯ð¬bM¼9N—–Èj˜ÿžÆ«ïÅ>Mm¼¹OœN§NùN1­Lçó†7û4U®jMZ69@W#66¶yÏô ЦM©´Ô»Ù2ŽV­ZÉãñèܹsÁ.&DDDÈétêÌ™3Á.&„„„(&&FYYYÁ.&X,%$$èøñãÁ.^èÒ¥‹Ž;ì2`RBB‚²²²T]Ý|±ßµk×NçÎSyyy°K 111ªªªR¡Îi…Æ%›Í¦³gÏ»˜ª–-[*;;;Ø¥À›Í¦víÚéäÉ“Á.&uíÚUG v0)>>^999ªª2Ô.W‡”——§Š óG™DÜ;wN.—¹Ùã-[¶ä²ˆÆ9ñpزeKƒâþë¿þKË—/×¢E‹Ô¢E`jç­°°0­]»6ØeøEÛ¶í4}ú ýeþ-ZüWM:M!!—sÃÆM5—ÃÃõpÑbݘèSîF=d1iðàÁšù¤Öx»Ý®©3µäÍ7µoï^ŸrÓÀU/--M‹/Ö‰'$I“'OÖW_}¥>úHC‡Uß¾}e±XtìØ1¥¦¦ªOŸ>zä‘G$I;vÔ®]»”ššZ³½°°0-X°@T§N¥ôôtíØ±CƒÖ5×\£ &hëÖ­úÛßþ¦[o½UC† ‘ÇãQaa¡fΜ©¼¼<………饗^Ò‘#GtË-·èÅ_Ô°aôÿ~õìÙSv»]³gÏVJJŠ¢££•““£‰'ÖÚHŽŽÖóÏ?¯ÐÐP………iåʕڲe‹,X £Gª}ûör:zá…´ÿ~IçOQ6iÒ$%$$(44T/¼ð‚8Ј©¨¨H‹E:uRÇŽ úæ›eµÆ†¡)SžÕ¦µ}û6ŸsÓ@³b†é1[¶lQÿþýµ`ÁY­VÝ|óÍzùå—%I+V¬ÐâÅ‹%IsçÎU§NôÕW_髯¾’ÓéÔo¼¡%K–\²ÍÞ½{kæÌ™:|ø°®»î:?^)))zûí·õ«_ýJÓ¦MS^^žZµj¥Q£FiÈ!*..Öm·Ý¦§Ÿ~ZãÆ“$%''kݺuzõÕW¦›nºI©©©JOO×£>ªçž{N?ü°***”žž®>}úhÇŽ—ÔsÛm·iÿþýzýõ×%Ÿj·ÛÕ«W/MŸ>]™™™êÙ³§¦M›¦J’4nÜ8effª[·nJKK«Yw¥IìÕKþóŠ‹‹Ó‡|PçìäÑcÆÈ0 mޜᗼœCM†aµÉYïŸ-Äé×¼Ÿþ¹î¸ãIRß¾}µk×.•——Ë0 2DsæÌQZZ𮹿EFFÖŒ3fŒÖ¬Y£¬¬¬K¶™““£Ã‡K’Ž=ªÖ­[ך»W¯^Úµk—Š‹‹%IŸ}ö™zõêU³¾  @›7o¾h»ÇŽ“$|¸ ’K‡[ Ј#¬NÿECG¼™3gê‰'ž°:°«®®ÖÅ_lumšÝê ­¢! !Â%‹Ðj$'&½ÊÊJy½^C1 qqŠŠŠ zn¹*\®Foç Y²"4d DhÈ M±™ˆ ´xÀ>4d DœV'¡Ô¾}†®6LÉ))ŠˆˆPaAŸþ˜êëë÷¯ù¯èªA–$ÅÆÅé‡Ö3O?¥ï7\Û IDATn4=7gÈMxxâD«S@ ¨®vkÞË/kÌ£tÇm#øurÿþMŽˆˆÐØ»ïѼý+¨f¬Ä²€$)&&Fãx@[·lQ¿“OÖÊ+tÒI'éÁ‡Ò7ß|£·ßzKýO9E—_~¹ìv»JJKõÈäÉpÚi:ãŒ3tÿøñŠŠŠÒÌY³4~Ü8X½Kø¯ªª*UUUÉn·+»S'uÌÊÖömók³ÙtǨ;õÑâÅúÏ7_=7 Y´-6›ñ˜@@’Ô»wo½·p¡žzòIIÒYgŸ­{ï¹G’”””¤K.¹DwŽ%¿ß¯k¯»N¼è"½þïëÔSOÕïÎ:K=zôЛo¼A3¶:®{w vƒÒÓÓõÁûï+??¿Ñq½ùfÉfÓ§Ÿ~Ò"órÉb´N9o=ì¿([dHæw¹\úôÓO½ï„NP§œMš›Í¦ ë×ë¡<è¾Ø˜%&%Én·Ëï÷·h^h9~¿__¯\¡>}Nlôþ7_]k×®Õ¹£5ò¶ªv»ƒš3dÐj4§+I›]ÉΤg#9NEEEI’6|÷zõî­Ž;6Ü¿ÿ¾Ü1c4cútýç›o4äê«CžŒIJN–í¿—²¶ÙlêwrýøÃMŽßòãZ´`†ßzkÐss†,ZÂúbeFfv\¿N{Ñüyó4eÒ$Ý;nœ$É&iöìÙ:öØcµmëV­]»V6lÐŒÇ×Ê+´iÓ¦ç‡æéÑ£‡.»ü ÕÕ×Ëa³iÝúuZ²dñ!cÞyû-õêÝ[çœ3P‹`zn[zzzÀt4‚’‘‘¡ÊÊÊCžúŽÖ'55U@@åååV§âã㣒’«SQQQJKKSAAÕ©À»Ý®œœmß¾ÝêT`B—.]´mÛ6«Ó€A999*((høÌü2dffª¼¼\µµµV§ÒÒÒäñxär¹¬N$%%ÉétjÏž=V§¢££•’’¢ÂÂB«SN§S™™™ÊË˳:ÔµkWmݺÕê4`Pvv¶Š‹‹åñx¬Neee©´´TuuuV§Ò*%'&½ü‚ÿoewì¨èèè çÆ‘«¢‰ß¹d1Ú›‰Î`D¨Ð€¡! !BCB„†,„ˆÓê€ý*\® ·áõù ÇT¹Ýª«¯znàç8CB„†,„ Y²"4d DhÈhÓ:tÈÔƒ>¤Y³çèégþ¡qãÆ+**ê q .jø:..NO=ýŒNèÑ#¨¹iÈ!4cÆ «S8â¹ÝUzî¹çtËßÿ¦o&À¯ÓN;­Éñzèá zîÙgµaýú æv ´=zôPnn®€\.—&L˜ ÒÒRÅÆÆêñÇ×wß}§îÝ»+""BS§NÕ°aÔœœ¬ââb=Z@@§Ÿ~º† "»Ý®Ý»wëþûï×E]¤~ýúiÚ´iZ¾|¹^}õÕFÇ=û쳺ûcÇIÒÝwß­ÿüç?zÿý÷->2mCee¥*++e·ÛÕ¹sguꔣ͛_ht¬ÍfÓ½÷Þ§E jùò¯‚ž›3dÐjDØíJ‰‰9쿸ÈÈ÷â‹/Öˆ#4lØ0½õÖ[;vlÃ}}úôÑ›o¾©aÆéÃ?Ôý÷߯ÜÜ\ :TN§S't’’““5hÐ Ý|óͺᆔŸŸ¯Ë.»L¯½öš\.—FŽ©W_}µÉqï¼óŽ.¸àI’ÃáPÿþýõé§Ÿ¶è>ézüúךóÄ“ztÚcújÙ2íܹ³Ñq·Ý~»l6›–,YÜ"ór†,ZOn¹E“’;Îç÷ë’gŸÕºÂ™wóæÍªªª’$}þùçºçž{î+..Ö¶mÛ$IyyyZ»v­êêê$IùùùJKKSll¬Ž:ê(Íœ9³!î³Ï>;hžž={6:î½÷ÞÓ?ÿùOÍ™3G¿ùÍo´zõjÕÖֶȾaŸõëÖ馿Þ(»Ý®Ñ£Çèâ‹/Öo¼qиÂÂBõíÛW=~ýk­_·.èyiÈ ÕhN3V’v»:$$4ÚµÙl†ç=TÌþæë~§Ñø5kÖè®»î:ìZ ’¤3Î8Cëׯ7¿nÝ:õíÛWÙÙÙ ·EGGKÚw âý_jܻᆱªgÏžZ±bEPûƒ¥¤¤44Ým6› 8M7nlrü÷›6éÍ7ÞPîèÑAÏͲh5>ù¤%ó¾ñÆš={¶êëëår¹4aÂCñeee7nœ&Mš$i_ÓoêÔ©Zµj•^}õUÍ;W‹/Ö /¼Ð丯¾úJ¹¹¹Zºt©ü~‹ï㑬WïÞrÕÕÖÕÉa·kÕêUZ¸pÁ!c^{íUõíÛW^ø-Xð®é¹méééÓÑJFF†*++U]]mu*0 55U@@åååV§âã㣒f¾³ ­CTT”ÒÒÒTPP`u*0Àn·+''GÛ·o·:˜Ð¥K—†ÏCÁ/GNNŽ äõz­Ndffª¼¼œÏú…IKK“Çã‘Ëå²:””$§Ó©={öX ˆŽŽVJJŠ [è3áN§S™™™ÊË˳:ÔµkWmݺÕê4`Pvv¶Š‹‹½t*Z·¬¬,•––t\´—Ë¥úúzC1‰‰‰ŠŒŒ QFÍ7{ölÍš5ëgoâ—…K­@vv¶iƶ1\²°ØÄ‰Õ©S'×JFëGC°ØØ±c­N!Â%‹ D8C­FrbbÐÛ¨©®V}}½¡˜¸ØXÅÅÆ=7Ž\.W£·s†,„ Y²"4d DhÈ@ˆÐ@Ûb³éß¿ÿßßuÏ=êÞ½{Ke‹µoŸ¡1wÝ­ILÕ£ÓghTîhEFF4î_ó_iø:6.NS›®c?>¨¹iÈàˆ×ÿ”SÔ®}{«Ó@ˆTW»5ïå—5æÎQºã¶ ü:ùgMøŸŠˆˆÐØ»ïѼýKßoÜÔÜ4dpÄûèÃuûÈ‘V§©ªªÒŽíÛd·Û•Ó¹³:fekû¶m޵ÙlºcÔúhñbý盯ƒžÛô€_¸uk×J’~wÖYúø£,Ρp\÷î6쥧§ëƒ÷ßW~~~£ãþzó͒ͦO?ý¤Eæå Y´N‡Rcû/6:¢ÉmÿY) iúcéºë¯WBB‚éüÑzmúî;y»®ûËPµÏÈÐù\Ðè¸ââbu>ª³Žk¡Ïæ Y´ï>5LÚ'vœÏç×Õw¾¤ï~,j±¹wë×_×ßo¹E~Ÿ¯Å¶‹ÖÅï÷ëë•+ԧωÞÿæë¯kíÚµº3w´FÞ6BÕnwPóq†,Zæ4c%Éá°+#­åÏd}ó7Ô©S'{ì±-¾mX')9Y6Û¾s§m6›úÜ_?þðC“ã·üø£-X á·ÞôÜœ! €VcËÎRý*'ý°ãªkê•_TÞâó=òÈ#zú™gZ|Û°N=tÙåW¨®¾^›MëÖ¯Ó’%‹óÎÛo©WïÞ:çœZ¼øÓsÓ@«qéߟµ:mß¶Mçœ}¶Õi }ùÅúò‹/;îªA>àûïôÜ\²B„†,„ Y²"4dжØlÆc–Ïä´:`¿ —+èmx<Ã1îšyýþ ç~Ž3d DhÈ@ˆÐ€¡! !BCBÄiu@k°dÉ{î¹òù|úä“OôÔSOiþüù ÷?üðÚ?¾Ö­[wØûÑz\ré¥:÷Üód·ÛµlÙ—zvî\]|ñ%ºø’KÆÄDGkÇŽ5ê]?l˜z÷ê-׫ÚÚMxøaUUU™žŸ3d€Ÿ)--ÕàÁƒ•‘‘aêþ¦Ì˜1£%ÒC3uëÖMgžù;ýíæ›4ìúëÔµë¯tê€zóÍ7tÍÕCþ-ùp‰>ûì3effª_¿“5|ø-yûmÚ¼y³Î:ûì r ! üŒÇãÑO<¡»îºËÔý§Ÿ~ºžzê)=óÌ3zøá‡©Ë/¿\ýúõÓ´iÓtÅW„2}ü×qǧÿ|ó¼^¯$éwÞÖ€£ßþöL}ðÁû*--•ÃáЀ§©SNŽzöì©5«W• Y´Ž%Ç%ö_lTlH󈊊Òûï¿/I:÷Üs ÝŸœœ¬Aƒéæ›oÖ 7Ü üü|]vÙezíµ×är¹4räH½úê«!ÍûéWGÝð}Ï_÷TJJÊc.¸ðB}ôчª¯¯—ÇãÑã3¦kÌØ±š;÷Y}üñÇÚ¾}{P9ð²h5Œ{[R;vœÏïÓG®ÑwyC’‡Ý¾ï¼Æ‰'êé§ŸÖ²eËš}Ïž=uÔQGiæÌ™ ·}öÙg!ɇöõÊ•pêÍž3Gåå*-)‘Ûín¸ßn·ëâ‹/Öð[n‘$µk×N#n»]×þe¨<|ð!Uº*õÉ'›Î†,Zæ4c%Éaw(#%£E²@@>Ÿï€ÛŠŠŠ4oÞ<5ê ûšºßf³iÍš5M^Îá5}úc __}Í5ÚµkWÃ÷¿ýí™Ú°~ƒÊÊÊ$IýûŸ¢Ï?ûL¥¥¥’¤'Ÿ|Bƒ¯¼*¨†,—,@«±¥pK³ÆU×VkWé®Ãl¦“N:Iß~ûm£÷ÍŸ?_;wV÷îÝ›uÿºuëÔ·o_egg7Œ‰ŽŽ–$9ކ¯^:åèÜsÏÕ’%‹n4x°^y商 uô1Ç4|L·nÚµ+?¨y9C­Æ%_ô6l6›á˜Î;kâĉÞôÀhÞ¼yͺ¿¬¬LãÆÓ¤I“ò™:uªV­Z¥W_}UsçÎÕâÅ‹õ /ÎÆÝÿÀj—ÞNuõõzàTQQ!IêÝ»·ª«ÝÚ²esÃØ¯¿þZ}N>^111*))±:¥´´4X °ÛíÊÉÉ úƒîa.]ºhÛ¶mV§ƒrrrTPP ¯×ku*0 33Såå媭­µ:––&Ç#—Ëeu*0 ))IN§S{öì±:­””Z p:ÊÌÌT^^žÕ©À ®]»jëÖ­V§ƒ²³³U\\,Çcu*0(++K¥¥¥ª««³:•6«ªªÊðï[ñññœ¹Šà’Å"4d DhÈ@ˆÐ€¡! !BCB„†,„ Y²"4d DhÈ@ˆÐ€¡! !BCB„†,„ Y²"ÎpNåtè¤. ÇyEØl†ãêëêi8Îï³ËîðŽóüа5¿Ç˜œ(wUª|ÞÃsÕú¼Šv/_­×§h§ÃpœW~9 öïÿŵîzÇ%Æ)hoZ‚áý3s¥¶]ï€Ï.›‰Ç›ÑzGFG*22ZI1ršú¹4¾fëmö1`¶ÞfžóÂUo‡Ó¡„„uˆ¶›z x~Sõ6S»¶\o£ìv›RÓÒ•i7÷ø6ûœ×–ë®×8›Í¦ôôvJwø ?ÆÍ>Ÿ·å׸pÖ;5=M¢#x ÏÎ׸¶\o3¤”$í”ìÆNÌ>籦9™ãŸ” O­_uunCq’ùçó¶ü®zGÇEËéŒPUj‚á¹Âý×–ëmô1àŒŒP\\¬:ÇÄ„åï4RÛ®w¸Ö4v§]IIÉʰùZõßå$Ö4?×¾}º2¤°üf?Ö43úHNMÑžø9|Ãs…ëïrûµå×83õNNIÖÞøXüÃó™a¦Þž€__oÞ¢Œ€#‹-==Ýø3µI×üödõÌïn8..É-÷Þ8Ãq‰©Ur•ÅŽ‹¯VuU¬á8»Ý/¿ßØ“|tl­j«£ Ï—\)w…ñ_$ã“«TUaü˜DÅÔ©®&ÊPŒÃé•Ïk|q—à–»Òx½R«Ti¦Þ‰Õªv™¨·Ã'¿ÏØ‹lTL­êjŒ×;>¥JUåÆ÷Íl\tL­j æé°ûäó_dÆ%VËmâø'¤Vª²Ìøc 6¡JՕƉ3Â#¯'ÂPLdT­êëŒ×;!©J•{çhö1W£wŒ¡»òËøâ4&¾F5UÆæ’Ì?ŸÇ%»å®0þ|á‘Ç`½£"ëUWoü—‘ød·ªLähö˜DÇU«Ömü1g†Ù¹Sªä2ñÜ—\%·™×¸¨:ÕÕ{‹ˆ¨—Çc¼Þ¬iî5MdTê ÖÛé•·ÞÌš¦Jn¯9¬iZ.Ž5ÍÁXÓÈüš¦Z5&ž_YÓŒ5ÍÁXÓì—°¦1ûÜÅšæ`¬iÆšæ`¿„5ÙßuÌ<Ùm~ùÆ›¬iÆšæ@v»_#x!D…^UU•jkk ÅÄÇÇ+:Úøsp8amÈ¡æv»UScì ¥qqqЉ1~B p8|†,„ Y²"4d DhÈ@ˆÐ€¡! !BCBÄ;Þê$ÚšÔÔTMœ4I´fÍjI’ÃáPîèÑúÃ…ÐþøGª¨¨è Øk¯½NW_}µÎ¿à|åïڥݻwòv´œ–®[ûöí•;z´¨‹þx‘vïÞ­ÂÂÂpïV›ŠÇÛ~MŸ¡””­_¿>,ûr$ Eݲ²²4zÌXù»ß)³C¦Ö­[Ö}:´tÝl6›FºSçw¾.¸àEFFé‡~÷nµyÁÔ­±X‰uI¸´tíX›„O(wû±> PÔõIèµtÝXŸ„‡Ùº굌õIèµtÝX›„G(oû±. ­PÔŽµIèµtÝX›ÇãñÈëõЉŒŒTDDDˆ2‘ÌiumÑð[GhéÒ¥Š‹o¸í¬³ÎÖ®ü]š ­–®ë“ðh麱> ³uk굌õIx´tÝX›„GK×m?Ö%¡×Òµcm-]7Ö&@ÛÁ%‹CàþñãzÇXll¬Ün·$©¶¶VN§SYYYÊÉÉÑSO?#IêÙ³§V,_.Ir»Ýª(/WFFF“·£eµtÝjª«Þ‘¡Êªª0îÍ‘£¥ë&IÙÙÙêÕ³—>ùø“0îÉ‘¥¥ëÖ«W/­[·–_(B¬¥ë–ŸŸ¯œœÎ:æ˜ct晿ӦMûCG³uk*–uIø´tíX›„OK×Nb}-]7Ö'áÑÒuc}fëÖÔkë“ðh麱6 –®›Äº$\Zºv¬M£¥ëÆÚh;8C6L/þ@÷Ý7N½z÷’ÛíVtt”|>ŸŠŠŠ4eòdIRBbÂ/ˆ•U•JJJjòöâââ°ïÇ‘&˜ºí¯ÍfÓ­#Fèω‚©ÛîÝ»5üÖš2e²º¼U»pD ¦nYYYj׮Ǝ½K ‰ ÊÏËל9³­Ú•#J°Ï“K?ÿ\÷Ü{Ÿ¢££5vÌ«vãˆÓœº5…u‰µ‚©Ý~¬M¬Líl6ë‹S7Ö'Ö ¦nn·›õ‰EŒÔíç¯e¬O¬LÝw;B'˜º±.±V0µcmb`êÆÚh;hȆIuuµÆŒÝðý?_|I%%%òz½Ú²e³$iïÞ½\Ê !>A.—«ÉÛzÁÔMÚ÷š;z´>þè#mذ!¼ÉÁ‚©Û ÁƒµdÉbí)- {ÞGº`êV[[§;vjö¬™’¤ '*''G;wî ïN‚©[ÿþ§¨S§NzÍÕJMMÕ¤ÉS4òöÛTÅ;ãC®9uk ëkS;‰µ‰•‚©ëëS7Ö'Ö ¦n¬O¬Óܺ5öZÆúÄ:ÁÔíP·#´‚©ëkS;Ö&Ö ¦n¬M€¶ƒK[àì³ÏÖ¦åõzåt:uì±ÇJ’V¯Z¥“û÷—$ÅÅÅ)½];7y;ÂËhÝìv»ÆŒ«¥K—ê³Ï>³2õ#šÑºeffê /Ôô3tý°aúã/ÒyçŸoå.‘ŒÖmÆõJOOoˆŽŽQ]]%¹ÉÌ<Þ¶lÙ"I*++SEE¹âãþÌD„VSuk ë’ÖÃhíX›´FkÇú¤u0Z7Ö'­ƒ™Çëë5U·¦^ËXŸ´FëÆÚ¤u0Z7Ö%­‡ÑÚ±6iÌ<æX›mgȆѸñ÷+""B.×^=öØ4IRÇŽuÛí#uóMÕÎ;õÝw4uê£ŠŠŽÖsf+4y;ÂÃlÝ ¬“û÷WǬ, |¥$iò¤‰ÊÏÏ·rwŽfë6íÑG¶qúé§++;[ï-ZdÕnqÌÖm×®]Z½z•¦N}T6»]+W®à0ad¶n|ð¾ÆŒ«Þ}z+*2Jk×®UQQ‘Å{sä8\ݚºÄzfk÷çAƒX›XÌlíXŸXËlÝXŸXËlÝXŸXëpuk굌õ‰µÌÖíôÿû?Ö&2[7Ö%Ö3[»üü|Ö&2[7Ö&@ÛaKOOg… €6Ãív«¦¦ÆPL\\œbbbB”Žd\²B„†,„ Y²"4d DhÈ@ˆÐ@›b³Ù ÇdЀ¡! !BCB„†,„ Y²"4d DhÈ@ˆÐ€¡! !BCB„†,„ Y²"4d DhÈ@ˆÐ€¡! !BCB„†, ÕŠÕäÉS´xɇzwÁBuìØQÏ¿ð‚®ºjHÈç×<á6dÈÕúâËeŠŒŒ´: dl6›á˜@ ‚LÉiup$zêégt 'H’\.—¶oÛ¦çžN_¯\Ùp}}½†ßòw=÷üó:æ˜nnçÊÁƒt÷=÷6lk¿'ŸxB/½ôâAóìØ¾]/¼ð‚–/\=S IDATÿªÉ¼öÏ;hð`ýýï·èæ›oÒúuë$IÙÙÙzáŸ/êå—ÿ¥¹ÿøG‹‹C¹èOÒ)§žª¸_µ5µ*((ùœ­ÝÙ¿ÿ½~ÿûs4:÷N«S4 Y°ÈæÍ?jÖÌ™JJJÒe—]®É“§èª+«°°ð€qÓ{LqññŠ‹×}ãÆéí·ßÒ—_~)I*))‘$mÙ¼YsæÌiˆÙ¹sGÃ×ûïKNNÖ%—^ª 'jÈUW¶¹ùÊüù:ãÿÎPnîh]wí_äõz5êÎ;•—·S/<ÿ| …CËÉÉQii©>\²¤á¶¿ –¹Ã5Q}OêT<ïú€ð¢! ©¬¬Ò7ß|#IÚ³gfÍž£nݺÔ]³f$)--M’´cû-ûoCv?We¥V¬XÞèxÿýÆêx´oß^·Ž¸M½{÷’Ïç×Ê•+4óñ™r¹ö6y¼zõê¥ .¼P6›M_|¹L_~ù¥FçÞÙä¾uëÖMwææªsNg}ÿÃÚ´iã!ëhY4dÀbiii:ÿ‚ ´}ûöÍ“˜˜¤ßŸ3P>ŸO[6onVLÞÎúÇ3OëÆ¿Þ¤šš½øâ?õÃ?49þÚk¯ÓÌÇ×üùótã 7êá‡'èòË.•Ûí–$ÝvûHmذA³fÎÔ÷ßo’ÍfÓ¤ÉS$I#o¿M7þ~•—•ëÅ—^TZzºzôè¡›oºIÕÕÕÌõî»ïè´ÓOר;s5ôš«5ö®»µcÇvÍýÇ?¹Ý¢¢B]yÕUzøá‡´uË{ÜqÚ™·³YÇcøð[5kÖL½üò˺37WS¦¯–-Ó½÷Ü­3w–®øóŸõé§ŸhíÚµ‡<555š}úè‹/—I’Ün·{lšvìØq˜¨ÃoK’þvóM MÁŸÞWRR¢±cF+//¯ÙÛ^²d‰nºùoJLLÔ 9vÙ—_ê­·Þ”$Õ×ÕiÖì9:ñĵtéRIRQaáŸ}zì±ÇéØc՘ѣµiÓ&mÚ´I_}õ•Î<óL½ù檩©‘×ëUQQa£óMž4Qÿ|ñEýcî³j×®†]½¼^ï!·;gÎlIÒi§®-›7ë·ßnö±X¹r¥^ÿ÷¿%Iü‘¾RS§>¢ÒÒRíܹS]t‘rr:7û¦ŽGii©Ž9¦›î»÷Þ†c“˜ ;ïÌUvv¶òóó=^’äñzU[[×pLµ¯›7oV‡4~Ü} gUw>ê( ru³÷²`‘-›7kÖìYÚ[Q¡¼¼<ÕÔÔ˜ÞÖþÏ£mØö–- _ÿøãzüñÇuÑE©OŸš…¿e¸,IZ±|¹î¸cd£Û1ⶆËß>òŽƒ„?UV^ÖðuQQ‘$)%5µá¶õ60¾C‡ IҤɓ¸}çÎæ±ZVV¦÷Þ{Oƒ_©/–.ÕÖ­[»ÝM›6iÌèѺöºëôìsÏkõêÕzðûU\\|Øù~Ú®¯«—ßïWii©$©®®N’äp:þ—_ÇÃáÜ÷ëxaáÿ.½ÿRÕíÛg44d~¼s¨}MKßw™ë]»v4 Ÿ÷ÀüÀ!Ç7u<*öVH’²²²´qã¾ÏtÍÌÌ”$íÞý¿ÆðÏ×'=àÛCík—.]$Ií32æIOO?d΀–ECڀĄ|rÿ†ïwîÜqЙåååzæ™§uÛm·kñhõêÕ‡¼tqbb¢FÞ1Jï¾ûŽV­Z%Izï½E1â6}óõ×*))9(æäþýuÉ¥—*??_7ÞøWUTTèÛoÿÓäßÿ½6mܨk†þEÕ55Ú[Q¡¬¬lÕÔT7\Ê·)‡C÷ÞwŸòòvjäÈÛuÿê®»ïÑÐk®>äv÷îÝ«.]»jÓÆª­­Qee•¼^ï!ç2«©ãQ[[«Í›Ô°nT]]N§†ý‹V}ûmÃÙ±M))-ÑñÇw×)§œ¢šš­Y³¦É}]¾|¹JJJtýõÃTSS£ø¸x]tÑŸB²¯€ÆÙ­N¼_}´6­áßYgÝè¸7ßxC[¶lÖ¹¹Šˆˆ8ä6o»ívIҜٳn›5s¦¼^¯ÆŒÛhÌ’%K4àÔzèÁ‡ät:t÷]cy)æ@  Ñ£sµùÇ•›;ZÏœ¥k†ýùI ú—¿è˜cºiâ„ òz½ztê#ŠŠŠÒÈ;Fr»þ@@—_~…æ<ñ¤¦=6];wîԜٳ?¡ M@  QwÜ¡­[·èÞ{ïÓÈ‘whõªUºï¾{»ÍçŸ^nw•ž0Q—^vù!÷Õãñè®±cT__¯‰'éŠ?ÿYsçþ#$û hœ-==½¿æphï°X .ÐÌÇ·:•VãX§¦¦Fn·ÛPLLLŒâââB”Ždœ! h16Ù¬N¡UáxhÈ@ˆpÉb´)\²­ gÈZ(##C±±±V§ƒRSS•’’bu0(>>^íÚµ³: ¥Ž;Z ²Ûí:ꨣ¬N&uéÒÅê`BNNŽœN§ÕiÀ ÌÌLEGG[ JKKSbb¢ÕiÀ ¤¤$¥¥¥Y ŠŽŽVff¦ÕiÀ §Ó©N:YLèÚµ«Õ)À„ììlEDDXLÈÊÊRTT”Õi²"4d DhÈ@ˆÐ€¡! !BCBÄÎÉb"ctÅé—Ž«®¯Vld¬á¸ªÚ*ÅGÇŽ«©¯ULd´á¸@ ›ÍÖìñ rU¹d 4?f?w­[qÑqÆãêÜŠ‹2çñyáˆ0ãóûä°; ÏUSW­˜(ãõv×T).ÆD½ëjÓìñ±±± rW»e·{OC§^Q‘FS”»¶ZqÑ&މÉ83yú~ÃÇC2~ü÷3Zïèèh9N•ìÙmê竸¼X2øP5û¨¬®TeM¥á8¯Ï'§Ãø|?lVM}á8pxamÈÇç1çózåq˜ˆóùÍÍç÷™Š ø²Ù›ß±ñø<ò¼ ø O%¯Ï\Ž>“qñ¯Ï+§Ãø˜×äñ7g´ÞûÇÖ{ë 7Û¼>ì~Föóù=&÷Í\œ™<Í6Í>ÞŒÖÛîµ+` ˜ú9q:œ:®Óq²xÃ…dþͲÙÔ1­£€¡°ÝåÅjŸ’a(&&2VùU^Yn(.à÷Ëf7Þ€/w—+%.¥Ù㇢¢¢´£h‡Ú%¶3<_Ye™RR ÇÕyêe(Æì›IÊ*÷(5!Íp\‰«ÄÔ1Ù[½WI±I†ãŒ°ÙlŠ‹‹Ó®Ý»LÍevßÌK3µóù|zýË× ¿y" Ãïí$sâ9êÔ®“Ḡw…’ã’ Å$$$¨¢¢Bƒo𨬮TBl‚¡I*Ý[ªô¤tÃq{*÷(ÍD½Í¼9Íã­W„ÓøªÊ+Ë”bâ9¨to‰Ò“Œ=õúç¯kéú/ Ï@[däºýŒþMh®°6dkëkõò§óÂ9e«–‘‘¡ÊÊJUWW[ HMMU Py¹±¬¯˜˜•””XJ«sBÎ Š1Öœ$ëù|>CMžÈÈH%&&ªhw±œ&þ~¿OvSq°½)Áì™Í>ŸW3oz19Ÿv»]íÛ·Wþ®]¿ˆ}3S»ìv4êÒQª÷ÖŠ+,+PfjGC1’´³d‡~½ÐpœÑÇœÍfSFF† ¿ Åè\–Åùýr|C‰™ç„}q~ÙM¼yÅÌÏrŸãúèŠÓ¯ ! Ð …µ! h}6ìÜ`u MŠŠŠRZZš ¬NØívåÔähûöíV§2+¾_©×¿xÝê4B¢K]mÛ¶Íê4`P\R¼N:êDõ=æ$ñF?vC2ßl6ÛHß^¼C¥®RÃqq¤v=>Ižß‡e>²À/\^iž¾ÏûA—œz±áX33QY]¥„Øæ–û~¥®R¥'»Du„=B1Q±ºåÉá†çhLÊ ‘’Ý®ÒY£Â2 Yà®Î[§éïÌ×ëµ:•—ž˜®gn}Jçž4Ðp¬™f³×çÕ‡«?2<h\ìÉç*ùO7É‘ž)_Y±Š§þM¶ÈheMx]å¯Îk᳊ê~²:Œ~Z¥ÏÜ«ºW+kÊ»Ú=k”’þ0L¾Š•ÿkÊA·•L»E±ýÏSÒŸn’3%Cõy?¨ì…‡äÉûAÎŒeMyWe¯<¦øÓ/’3µƒª¿ýD¥OߣäKþ¦Ø~çÈf³)î…5*yò.Uõ¿ ‹îyšlQ1ìCÀëQͪOeâ“ü$ÑЊíqíÑ??zQÝ;o8¶¦¾V1‘цbŽîx´"QZôÍ"Ãó€9;vUú_'¨nóí]0W»È[ºKuØØô¿NPͪOU³úóFosfvQú«ò“×T½r±’/®ô›&ªðîKÆ'­Ê_®˜^§+þÔ T½ü=U¯ø@‰ç UÝæ5ªxc¶<…Û˜7þÿþ¤¸ßüþ€Ûj7®Ü—GÀoî8˜Š€0( 7¿z+ló >c.èwžzu‚¡¸J·K q‰†bâââ´­`›V~ÿµ¡8ÉÜgÿJÒ¦¼Mò›ü壢»÷“ÍáPÅ¿gªî‡o%©Ùg™V¯x_{ž¹W’äÌÈ9è¶ø³Éæp(ñìAJ<{¤}¿/ë'WËr¯x_îÏß”ww¾âúž%{J†ZóqXæÊÌÌÔ‚å U[Ü/uÍÕ»k/¹l´þØÿBCqUJŽO6<_~i"Î}ïN6 ¸¼X)†bœ§þõé<}óã7†â¡UûãjIRòeÃUõù›ŠÌ9N®÷^oo©€âú#oÉ.%ž7Ôø¶7,WÀëQÒÀ!ªxçi9â“eOHQÕG¯6Öï®Tdçã;àByò7˳cÓ|^•Ì)ÙìA» Y8¬ÞºF·¾C‡Ú•¿Kg&_M=çùü²›x. ÷ó¹ÑÇw»víTVV&ŸÏgx®½n—6ìÜ`8-#++K¥¥¥ª««³:a@C\Õ.-+úÊê4`@RR’œN§öìÙcu*0 ::Z)))*,,´:àt:•™™©¼¼<«SA]ëºjëÖ­V§ƒ²+³U\\,Çcu*€C0yÞ>àphÈ@ˆÐ€¡! !BCBäÿÙ»ó°¨ëýÿÿfØb‡DQÈ–£†ij–yZN‹'ÏïÓ¯R~Ž©æ’©™•šI»©ee›fŸ“fY¦vLËÌ%@q MÁDPQ@¶™ïÖœL fÒûíºº.æýZžÑ®«ãyúz½MîÔëÖ­S§NTUU¥ 6háÂ…Z¶l™}|âĉZ¶l™ÒÒÒjÇ¥åïï¯þ*6&Ff³YÛwl× $IOÆÇëæ–7ËRY©²²RMš8Q÷Ýw¿~äûzoo>|XÇ?§Ž;ªwŸÇe6›µyó·Z´pa²ÑÀeÅ`08¼Æf³ó9//O=zôІ tüøñóæ×4~!³fÍÒ!C·?VYY©õë×)%9YƒA3gÍR\\œrssծݭê÷T_IÒO>©¿Ý{¯V¬øX+V|l_ÿT¿~ÊÉÎQ`` žôŒúÆ?©¢¢"Mš–››«á ꔇ+‹Po˜=̺ÊûªçUTV¨¤¼Äe9ŒÆ³ç'Ož¬E‹é»ï¾»èñ¸¸85iÒDsæÌ±?Û¸q£Ë²â¿<==õÊØ±š‘”¤²²2]}õÕ2ôY=Þ§·,‹ÆŸ ¢Â"mØðIg~øa=3h¤³'ŸÏl6×) YÔŸ%|¢†! kœWe­RÏ©½´÷È>§Õ¶Ùlªªª:çÙ±cÇ´téR >ü¼±  íܹó‚×Ã5Ìf³ÆŸ OV®Prò’¤öíoÓ¦•——'IZ°à5õøßÙ²wÝu·öìÞ£“'OJ:{"¶éµMí{^}õÕ眘­ ®,@½q1ÍXIò0z(<8Üiu£££•üË;HoÙ²ejܸ±š5kvQãiiijÓ¦¢¢¢ìs¼½½Ïæöð°ÿ ç1›Í7~¼>ûìÓsN#;–£¦×]gÿ|Ýõ×ëèÑ,ûçî=zèÃ?´NINÖÍ­ZÉÏÏO’ô@§¿këÖ­uÊÆ YÔsêÚˆkkœWRV¢£yGV7$$D“'O®vÌf³iܸqZºtéEŸ¬¥| Ã™’¤çž^·¶o¯o6mªum®,À/33SÏæîpoooÅ?õ”ÌŸ/³§§$©´´Ti»vI’l6›NœÈÕUW]¥ââbÎÌÑhTtãÆº&2J™uªÏ YÔf“‡ü|=kœW^Q©’2‹Óêþz2öž¿ýMÿùê+§í ÷{ª-[ºT§OŸ–Ñ`8oÜß?@7ÜpƒÌŸ'Iº±Y3ÅÇ÷UXX˜¾\³FYYYuªOCõƧ ãÕ°A`󪪬zìù÷´÷À±óÆÎo¹ÕÌ&iæŒJš1CÛ·m«Å¨î¼ûnåžÈµŸ†ý=³Ù¬çGŒÐ‚×^Syy¹$éǽ{5|س2zfÈP=ع³VöY­3Ð@½q1ÍXIòð0*<Ô¿Ú†lm8~\ÿûßzzÐ Y«ªœ¶/Üçæ›[éÚ¦×ê¶·K’BÃÂ4{Þ<½8|¸*++5bÔKZóùjíÚ™zÞZ«ÕªíÛ¶ªU«ÖuÊ@CõÆÁŸótmtXóJJ+”u¬ÀéõW|ü±æÎ›'___§ïKoÖŒ¤s>¿¾øM ~úi™Íf½8r¤Ö­ýRßoÙb RáéÓ²Ùl2 jwk{íݽ»NhÈ Þxôé7ÝZßf³iêÔ©ZôúënÍ×êÜùŠKŒÔŒ IDAT‹k©ˆˆkôX¯Þ’¤Ý»Ó´kçNuéÚMåò0”¶;MëÖ­­S-²Àodfdèþ{ïuw ¸@ß'Ÿ$­\¹B+W®¨vÎæo¿ujM£SwÜÍ`p|Íæü€hÈ€ËС! .BC\ÄäîÀ¯NÖyŠŠ ‡×X*+Rø=NÈ€‹Ð¡! .BC\Ääîà þþþê?` bcbd6›µ}Çv-\°à‚Ï%É××WƒQLl¬*+-J3FyyyµÎ@Cp¡Y³fiÈ!îŽqEª¬¬Ôúõë”’œ,ƒÁ ™³f)..N¨öù®]»4fL‚6}³I‰‰“’†,®xÁÁÁZ´h‘l6› 5iÒ$åååÉ××W³gÏÖÞ½{Õ¬Y3™ÍfM›6Mñññ ÒñãÇõâ‹/Êf³©cÇŽêÙ³§ŒF£Nœ8¡±cÇꡇR»ví”””¤ï¿ÿ^Ë—/¯vÞ›o¾©—^zI‡–$½ôÒKúᇴfÍ7ÿÊü¹•––*%9Y’d³Ùt,ç˜üüü.ø<<<\aaaú|õj§eಸ¬ ‡×DGGkÈ!Š×Ê•+5räHûX«V­´bÅ ÅÇÇkýúõ;v¬^xáõîÝ[&“I·Ür‹‚‚‚Ô½{w 0@}ûöUVV–ºté¢>úH………6l˜–/_~Áy«V­RçÎ%Ijß¾½¾þúkgý’@R@@ š5o®ä_±Õ=oÚô:œ*PÂ+c5åÕ©š>=I¡¡¡uªË YÔf£Q~^^5Ϋ¨ªÒ™Š §Õ-**Rqq±$iÓ¦M=z´}ìøñãÊÈÈ$9rD»víRyy¹$)++K¡¡¡òõõU“&M4gÎûº7žW'..®Úy_|ñ…ÞyçÍŸ?_mÛ¶UjjªÊÊÊœöý®tžžžzeìXÍHJ:ç×õ÷Ï}}}¦—GVYY™î»ï~õêÝ[3’’j]›†,ê ƒéšÀÀçUY­zäÍ7•–“㔺6›í‚c¿6_e±XΛc0´sçN5êëüѼôôtµnÝZ<ð€>ÿüó‹LŽš˜Íf?AŸ¬\¡ääþðùÉ“ù:°¿½i»ºî»ÿ¾:ÕçÊbÔÓŒ•$£Q ýýV×ßß_þ¿ìwçwj÷îÝ­OKKS›6meæíí}6«‡‡ýç?š÷é§ŸêP\\œ¶nÝZ§ïƒ³Ìf³Æ¯Ï>ûôœËz¾gÏÝxã ‘$µkw«ÒÓÓ딲¨7äæêº«¯®qÞ™òr9uÊiuþùg½ýöÛª¨¨Paa¡&MšäÐú“'O*!!A‰‰‰’Ξ„6mšRRR´|ùr-^¼Xk×®Õ’%K.8oË–-zá…ôÍ7ßÈjµ:í»]ÉyäQÝÒúEFF©ïSý$I©©):šu´ÚçIÓ§kæÌ7~‚l6›òóó4å—ß«Ú2„……]øü5\*<<\EEE*))qw8 $$D6›MîŽøùùÉÇÇG¹¹¹îŽxyy)44TÙÙÙîŽFEGG+33ÓÝQP 111ö÷¡àÏ#::ZÙÙÙª¬¬tw8 ""B¼èO&44T‹E………îŽÊd2)??ßÝQàooo+ÇIWâÒ0™LŠˆˆÐ‘#GÜŠÕ¡C‡ÜŠŠŠÒñãÇ«½:õ[dd¤òòòλÎc±Xtúôi‡Ö˜Íf^äé\Wš7ožæÎ«}ûö¹; œ„+‹€z **J4c/3\Y ¸ÙäɓըQ#‡¯JFýGCp³‘#Gº;\„+‹ÀEhÈ€‹pe1ê €€:ïQZV¦Ó§O;´Æäáá”Ú¸r*,¬ö9'dÀEhÈ€‹Ð¡! .BC—C-ÖØœž8ËäîÀŸ•,Z¤Þ=æî(¸///õyü µlÕJû=õ‡Ï4×ññ –ÙlVNv¶fÏœ¡ŠŠŠZ×ç„,P‰“'»;œ ß€Ú¶m« †šŸ—”œÑÒ>Јç‡ë¹¡Cd³YukûöuªÏ Y\ñš4i¢™3fhöìÙÚŸž®‡zH·Ür‹ÆO˜ ;vè“•+Õþ¶ÛÔµkWFåæåiê”)0{æ ™Íf~w™uuÏ‹‹‹U\\,£Ñ¨¨FtMd”23–Õ©>'dpÅËÌÌÔ´iÓôâ‹/J’>ùäêåÑ£õÉÊ• Ô#<¢ç‡׳C‡*';[ÿóÐCnN W¸±Y3½:mºÆŸ Û¶)++«NûqBõ†Éä!o_ïçY,•—Öþ½žÕÉÌÈÉl–ŸŸŸŠ‹‹ÏkÞ¼¹EG+ñ7§b7oÞìÔú¨~Ü»WÇ=+£Ñ¨g† Õƒ;kõgŸÕz?²¨7Ƽõ¼‚×8¯ªªJÓ‡Îבýu;½ø{F£Q6›í¼çƒA{vïÖ„ñãÏyîãããÔú¨?¬V«¶oÛªV­Z×i®,@½q1ÍXIòððPPX`õƒCõÏÿˆÍ¦˜ØX•••éÌ™3’$“É$///IÒž½{Õòæ›uÍ5ר—ü:†ËG`P ¿üûc0ÔîÖö:°öä„,êœÃÇѸaóÊKË•Ÿ“ï´ºÑkذazõ7W¯\±B³çÌц ´léR½š˜¨—$IIóæÍÓO8-ܯE‹êÒµ›Ê+*äa0(mwšÖ­[[§= aaa矹Æ%®¢¢"•””¸; "›Í¦‚‚wGüüüäãã£ÜÜ\wG¼¼¼ªììlwGŒF£¢££•™™éî(¨…˜˜edd¸;­ììlUVVº; ¡‚‚•••¹; *‹Å¢ÂÂBwGe2™”Ÿï¼ÿ³®çíí­àà`åää¸; `2™¡#Gޏ; «C‡¹;¥ãÇËb±¸; ©¼¼<•——»;J½Pç=ÊÊË•uô¨Ck¼½¼YçÚ¸rºÀŸ¹²\„†,®x\) W¡! €ËŠÁ݀ߠ! .BC\ÄäîÀ¯NÖyÊÊJ‡×TUU9¥6ð{œ¡! .BC\„†,¸ Yp“»À¥öÈ£ªS§¿Ëh4ê»ï6ëÍŋհa„ž~úi‡„ÈÓÓSG³²”˜8Yåå嵮à YàfÍšåîp믿^wß}è¯ø'ŸPl쵺½C9S¬·ÞzKƒž¨§úÆËj³êŽ;î¨S-²€$___Í›7OC‡ÕòåË5tèPµk×NIIIêÖ­›$©cÇŽZ¸p¡^ýuMœ8Qžžžºÿþû5eÊI’···>øàEEE¹ó« 7Þx£~رC•••’¤U«>Q‡TTT¤C‡Êh4*&&FEë§Ÿ~ªS-®,@½a’‡|<¼kœg±UªÌZûkd/¤M›6Z¹r¥fΜ)Iúûßÿ®aÆI’‚‚‚Ô½{w 0@V«U P—.]ôÁè¯ý«:uꤖ-[êÃ?TVV–Ó³ÁyrŽSÛv·Ú?Çݧàà`IR‹›nÒ AϨAƒútÕ*ýüóÏuªECõFÒ_^Q˜gHóªlVÙÿª2ÊŽ8µþéÓ§µnݺjÇâââÔ¤IÍ™3ÇþlãÆ’¤ÄÄD½õÖ[úùçŸí§eQmß¶Mnï yóç« à”òrsuæÌIÒî´4õï÷”ŒF£^|q„~øa}üñǵ®ECõÆÅ4c%ÉÃ`Tˆgpµ YƒÁàp]›Í&Iö¦\u ƒvîÜ©Q£F7æëë+›Í¦ÀÀ@FY­V‡3àÒš9s†ýçÇzõÒÑ£GÏ·Z­únËwj×¶]êðYÔYe95¯¬ªL¹ù.N#yxxÈÛûìÊiiijÓ¦Í9ï‡ýulìØ±JLLÔÖ­[ïò\pžF¢Õ©S'­[·VÁÁÁö†¾Á`P‡whß¾}uÚŸ²¨7^HŸàîçX¾|¹/^¬µk×jÉ’%JHHPbb¢¤³ »iÓ¦©yóæ:pà€’““µsçN-^¼X›7oÖž={Üœdì¸qº:ìj•WThܸq:uê”îºûnõüWO••—ËÃhTJjŠV¯þ¬NuhÈ’JJJôðßólÑ¢EZ´h‘ýó–-[´eË–s椤¤Ø®ªªRŸ>}\šΑ0fÌyϾްA_oØàÔ:\Y .BC\„†,¸ Yp“»¿ ¨ó‹ Zãa4:¥6®\§ «}Î Yp²¸¬j±ÆæôÀY4dÀEhÈ€‹Ð1¹;p¹X¹j•þÿÿùŸçu¸ãý«gO••–jÌË/«¸¸ø¤sŒ,Z¤Þ=æî(.ñ¯ÇS‹æ-d©ªRyY©f&%é®»îÖƒÿø‡}Ž···²ŽQ˜—k]‡†,p‰uíÖM'LÐѬ,wGùC6›ÍÝ\"<<\­ZߢáÏ•$ýoÏžúë]wiõêÏ´zõgöy½úôѱœcuªECW¼«¯¾ZQQQÊú¥Aúì°aÚµk—¾Z¿^õê¥V­ZÉh4êðáÚ‘”¤–-[ªK×®’¤ÈÈH¥¥¥iFR’}?M6MPT£F Ðüy󔚚ª.]»*66VƒÖæÍ›µê“OÔþ¶ÛÔãÿW6«UEEE𑔤“'OÊÇÇG¯Œ§CªÝ­·jîìÙêݧöï߯ëo¸Af“IóæÎUÏ^½ ¹¹÷Ê+Õ6R5bäHyyyÉÇ×Wÿûßúö›o4uÚ4>|Xá ÊÇÛ[³fÍÒþôtI’ÑhÔÐgŸUT£FòöòÒìÙ³ícf'Ož”‡Ñ¨[om¯#YGÔ¬ys-zíµsæx{{ëöwè™êT‹†,®xgΜÑý< 7/–‡‡‡Ú´m«ùóæI’þýÿ§wßyG’491QQQQÚ¹s§vîÜ)oooÍž3GK?øà¼=›5o®II:xð ®»î:=ýÌ3:x°þï£tï½÷jJb¢Nž<© à`õë×Oƒ Ò™âbÝ~ûíúì³óòÙkro¾ùf}±zµ.X ݧIIš?ožºýóŸzaÄ=¯ŠŠ Ÿ0A-[¶Tjjêyyn»ýv¥§§ëí·Þ’$™Íf™L&ý¥Y3M›6M™ºþ†ôâˆzòñÇ%IQQQóòËÊÌÈP“˜½üòËzò‰'\ò{p)Y,½¾h¡^ý²ÌžžzsñúùçŸÏ™sßè›Me±XêT‹†,ê ƒ‡I&oŸçY-UU”9­nii©î¼ë.½¹x±Zµj¥Ýii*//—Á`P÷=ÔôºëTZR¢ØØXØ×õ0@+W®Ô±cç_k›{â„<(IÊÌÌTXhhµµ›7k¦´´4ùå=²ß}÷ž}î9ûxaa¡¾þúëÿî››«Ã‡K’Ž=ª½{ö¨¢¢B’”­àjëlß¶Mã&L¿¿¿>]µJ™™™2™L:qâ„232$IûÓÓåéé©«üüd­ªR^n®},3#C&³Y~~~õò·Ž S¿þ4xÐÓ²X,1r”Š ‹ôí·ßH:{2øÁÎ5ò…ê\‹†,ê[G%É;8¬ÆyÖª*%ÏNPñ‘Cç ×µY­:øÓOŠ‹‹ÓÝû›Ö¯['Iº÷¾ûÔ°aC1B’”8eŠ}MÛ¶mÕ <\3g̨vϲòò‹ªíáá!£Ñø»¯ðßïPRRrÎXùïö½ØœùùùzzÀµm×NÞ{Nëׯ׺µkåááqnísƒœ3f4/‹÷ʶ¾¥¾Û¼Yùùù’¤%o¿¥‡»tµ7doïp‡Ò÷ý¨S§NÕ¹–±æ)À¥q1ÍXI2zxÈ+°ú“ µµfÍÝó·¿©Y³fúá‡$Iþþþ:qℤ³ï™mÑ¢…$ÉÏÏOýÔô©Së\wWZšZÞ|³üüü$I:tо½{ë¼ï…lß¶MsfÏVÛ¶m%=-zíµ×J’n¸á••—ÛOëþv,&6Veee:sæŒË²]*¹'Ž+æ—ï%I±M›*'û¨ýóÃ>ª•+V8¥'dPoœ9–¥«FÕ8¯²¼LeùÇZ{Çöíø@ñññ6l˜ÓràÒðòò’ÍfÓôéI ÔO?ý¤éÓ§©iÓëTpª@ ¯Œ•¯¯¯Lš4i¢òóók]‹†,êÿﺪAÃçY«ªôå3}T°ŸÓj{zzªªªJ’TUU¥ŠŠ Y­VÅÅÅ©I“&š3gŽ}îÆV—^ii©ž|âqûçgV׮ݔ››«ÐÐ0½])))’¤6mÚ¨G3fŒ¶lÙ¢-[¶œ·nÑ¢EZ´hÑ¥Ž‹::tè úÆÇW;–’’¢AOtZ-®,$ª¨¨Èþùúë¯×±cÇܘ—NÈ’æÏŸ¯áÇ«¤¤D&“Iyyyš:uª»cáOކ, iïÞ½êß¿¿»cà2ÕÅà"4dÀE¸²õFP@@÷°Z­ÊÏÏwhÁ`pJm\¹NVûœ²à"4dÀEhÈ€‹Ð1¹;\J „ë‰øxËl6+';[³gÎPEE…¼¼¼Ôçñ'Ô²U+ ì÷TkqBÀ¥¤äŒ–~ðF}ÚþóoíÞ½[¾¾¾2™ÎžÅ45j”,X ·ß~[ùË_êþ‹s™)--UJr²¤³ ìc9Çäçç§ððp………éóÕ«V‹†,ê ƒŒ2{xÕø‡ÑìôÚ]ºtÑG}¤ÂÂB 6LË—/·½óÎ;z÷ÝwõÆoèßÿþ·NŸ>­U«V©sçÎ’$µoß^_ýµ$ÉËËKkÖ¬‘${“öWAAAêÞ½»  ¾}û*++«ÚÚ©©©ÊÊÊÒÛo¿­N:Ù®¿åïﯞ={*--M•••’¤èèh}øá‡êß¿¿Æ¯±cÇ:ý×êr¨fÍ›+99YM›^§‚SJxe¬¦¼:UÓ§')44´Nûse1êͺÊÛÓ¯ÆyV›UÛ÷¯RQi¾Ój[,– ŽõêÕKÒÙS´sçÎUvv¶¾øâ ½óÎ;š?¾Ú¶m«ÔÔT•••I’ýtëäÉ“µhÑ"}÷Ýwö½âââÔ¤IÍ™3ÇþlãÆÕÖ}å•WÔ´iSýóŸÿT||¼ú÷ïoŸé’%KTTT¤]»viĈö5'NœÐÁƒ%I”Ùl–¿¿¿ŠŠŠjóËrYóôôÔ+cÇjFR’ÊÊÊäëë«ÐÐ0½]3gÎиñd³Ù”ŸŸ§)¿ü>Õ–!,,ÌæŒÐp\xx¸ŠŠŠTRRâî(p@HHˆl6› .îoè ~ðóó“ÏEýÍ!Ô^^^ Uvv¶»£ÀF£QÑÑÑÊÌÌtwÔBLLŒ222ÜŠŽŽVvv¶*++݈ˆˆPAAý $ü9„††Êb±¨°°ÐÝQà€ÀÀ@™L&åç;ï*;¸ž···‚ƒƒ•““ãî(p€ÉdRDD„Ž9âî(pPll¬:äîpPTT”Ž?þ‡ï¼Dý©¼¼<•——»;Êeí×÷¬:",,¬VµæÍ›§¹sçjß¾}µZËWµ¥€€š±¸ ®,jaòäÉjÔ¨‘&Mšäî(¨Çhȵ0räHwGÀŸW€‹ÐÀeÇ`08¼Æf³¹ ®t\Y €z#( À)ûäççתvm¹€$*,¬ö9'dÀEhÈ€‹Ð¡! 8 ((ÈÝð'brwÀÙ ’l®±ý²îøúújâ¤IzzàÀÚC½àçç§Þ?¡&Ëd6+55EKÞzK’Ôþ¶ÛôÏî=d6›µmÛV½óöÛuªÅ Yà7&Nž|Á±’’š±—ªª*mÚøµžþœ† ¢ë¯¿^Íš7W@@€žŒï«—_¥A¨Q£Fºé¦›êT‹²¸ü ’ͱ3²÷ÜstË-·hü„ Ú±c‡Ö~ù¥^7N‡T»[oÕÜÙ³5tØ0õ~ì1ùøøhrb¢öï߯ëo¸Af“IóæÎUÏ^½ ¹¹÷Ê+²9˜®WZZª´]»$I6›M'Näꪫ®ÒMqqJINVqq±$é«õëu{‡;”––VëZœ$}³i“>ùäêåÑ£õÉÊ•’¤›o¾Yé?þ¨'\?þøã9knŠ‹ÓêÏ>ÓÐÁƒµqãF½0b„^3FO(“‡‡Z¶l鎯øûè†nЮ;ªüü|ûX~^žÂ®«Óþœ@ýa4Éhö®qš­Ê"[e¹SK[,çŸg,,,Ô×_]íšÜÜ\>|X’tôèQíݳG’¤ììl‡„85#œËl6ëù#´àµ×T^^®ÊÊÊjçÔ YÔQÿ3^&¿ÐçÙ¬UÊù2Qù‡VûÁεæ‹/Î{^RRrÁ5ååç6…-‹ÓòÀµÌf³FŒzIk>_­];S%Iy¹¹jÒ$Æ>'4,윳µÁ•Ũ7.¦+I£‡<|‚Z»uëÖg3˜LòòòrêÞ¨_Ìf³^9RëÖ~©ï6o¶?OÛµK7Ýt“®ºê*IÒÝ»W?ìØQ§Zœ@½Qq*[žA×Ô8Ïj)Seq®Sk/ÿðCIÒÊ+4{ÎmذÁþY\^:wþ‡ââZ*"â=Ö«·$i÷î4½6ožÞï]M™:MeååJÛµóœ†mmÂÂÂlÎ Ç…‡‡«¨¨è¹£þ ‘ÍfSAA»£À~~~òññQn®sÿã ×òòòRhh¨²³³Ý0ŠŽŽVff¦»£ bbb”‘‘áîpPtt´²³³«}Ç ê¯ˆˆ¨¬¬ÌÝQà€ÐÐPY,º; (“ÉTçkÆpiy{{+88X999L&EDDèÈ‘#îŽÅÆÆêСCîŽEEEéøñã\ú'©¼¼¼ó®ºÅYANÙçPf¦¬V«Ckb›4©ö²ÀÅ8u?+òo¸ Yp²à"4dpÙ1ÔbÍé)²à2&w~uª°Ð)ûXmŽŸw-,*’ÁP›³µÀ…qB—Ú4Vmµhâ5¡! .BC\„†,¸ Yp²ÀEòõõÕŠ+ÜNàíí­¡CŸÕ{ïpÎóŽ;êÅojÉ;ïê©~ýê\‡†,à›Íæîp‚¡CŸÕæï6Ë`øï³ÀÀ@==è=;tˆz÷zLMš4Q«V­êTÇTÇœÀeá©§žÒý÷߯ñãÇ+((H}úô‘ÍfSaa¡&M𤼼ÿ\wÞy—RRRj]‡†, )==]o¼ñ†BBB” >}ú¨¸¸Xýë_5räH=÷Üs’¤èèh=÷Üs:xð ®½öZMžû\gæÌ}&“ ƒ‰ U ¥ ¥^úø¶”~¡¿ZP(¶r±¿@‹·@~Š ú¥ˆÜ$BŠ(Š—*µ¿ ¨·"­BED© 7%’L2™û¹ß÷÷00 ™µæ\f&¯çãáÃpf¯ËÙkïµ?{¯³×’¤^xAÁ`P---J¥Rºà‚ tÔQG)“ÉèÈ#T<¯jQ[ÅbqÚgÁ`pVy2 €9ãûŸyú:>V.û:çŸ^Ô³› ûýû«ß|4áyÞk¦õßÇQ¥RÑi§¦Å‹kÕªU’¤õë×[×1<<¬#^ÄÞÿîîîÞçYÿyP'3Œ•¤@ÀÑ¢Žo‰D¬ëðÄOèøãWKK‹$éío»žy晽ïîîÖÞðIÒG¡\.§t:­x<®]»vI’zzz´bÅ ë: 1žøÅ/´â¸ãÔÜÜ,I:õ/þ·{ì±Yåɲ˜3~·=¯#úÃÝ.+kÛîéÓËN‰F£J§ÓVuÓÚµkuÛm·©P((‘Hèºë®Ûû÷Ÿþô§:çœs´dÉ…B!]}õÕ’¤ï}ï{Z³fn¿ýv¥R)=øàƒVå£q²Ù¬î¼ó‹ºí¶Ï*—Ïë¿ø=ô£Í*Od0güÕå/V%Ÿ±±±Y¥øá‡õðÃOû<“Éè}ï{ß~ÓLLLhåÊ•³*õU(ô·ûî}>ûѨýð‡U+ƒ)‹ F€a@j„Y¨d F¼FW˜ÒW%Ÿ‰‰ U*£4ñæfyÃg°3‘Hì÷sÞÀ‚ãX¤ñ«^ €Y¨d FÀÂãXLZì3i1ªY¨¯Ñª­»»[ƒƒƒFiŽ8òHmݲ¥6¼púé©Óþò/÷þw$ÑömÛtÕÿù„už È`ÁÉårÆi~÷Ûß* Ö 6˜/¾óoë;ßùöÞÿ>ï‚ ´kç®YåÉ”ÅXp2™L£«€y.‰èä?~‹~ø_ÿ9«|xCs†çûЍrÐíŠr”wüîa¹\®fµp:åÔSõß?¤b±8«|ÀœqmþEu8L-ûÒõ¡%Úê†ëP+j\×Õi§Ÿ®+.»löyU¡>@UÌd0V’ŽÔî—j\ªNþã·è7¿úµ&&&f²˜3œÑv9ßÑÈkLëX”í[¤ÁÂtÆ;ß©{7n¬J^LY €9ãªða +ûío{›}ôц•¹aùòåÊf3Ú²esUòã Y@ÒC?Üè*`xæ™gôñ+®¨Z~ È@0 5€,Ç1OãûÕ¯y È@x®0e"‘¨J>årÙ8M2V —«JùÀÞ€a@j„Y,8Žã§ñ}¿5Á¡ŽY¨d FÀ‚søá‡×,ïX,¦7Ö,Ì gœq¦î½÷¾YçÀ,œd2i•nݺuU® æ£#Ž8B+Ž[¡ÉÉÉYçÅ€,›ÙSN9E'žx¢Ö®]«³Ï>[’ôÖ·¾UŸÿüçõ…/|A×^{­B¡Pµ«Š9&êƒún^»VÁ*´7²XpŠÅ¢qšüàJ$Z½zµ6lØ ¶¶6sÎ9ºøâ‹uá…jûöíz×»ÞUƒÚb.ùЪUúÊW¾¢‰‰ ¹îì‡S½*Ô ¨ ß ÈDºã—ä”ó5­Ë±Ç«×½îuZ¿~ýÞÏz衚–‰Æú³SNÑî¡Ýz⿨Zž È`ÎÈ…i?èv¾_QäÉu ¤·×¬.Žãè—¿ü¥>ö±íóy,«Y™h¬þð½á¨7èmo›$©§§G_þÊWô¾‹/V6›µÊ“YÌ3Œ•$Çqå‡[¥*ÈE"år9=ýôÓºòÊ+Õß߯íÛ÷”‰üí]Ì_×_Ý>ÿýoÿÿ½÷‚ f•'²˜3œô.ùM‹º_ÊËÉU½ü 6èÎ;ïÔ< ¯~õ«ºêª«tà 7ì©›ãhÍš5úÍo~Sõr±p1 €9#úÄM -ÿŽ;îÐwܱ÷¿}ôQ=úè£Ó¶;ãŒ3êY-4È9sö¬óp«PÀ~0 5€,Ô²P# È@x®0¥-¯J>©dR¥RÉ(MsS“"ápUÊÇ¡g"‘Øïç¼! 5€,Ô²XxÇ<ïW¿8ä1 5€,Ôˆ×è sÁ¹çŸ¯gŸ~ZÏ=÷\£«‚éééÕ߯\©¶övƒAíÔ­·Ü¬B¡`'oÈ3tíõ×7º ¨¡L&­oüë¿êò|Xÿß%«äû½ù¤“f•'oȯrÒý‘Î:ë,¹®«á‘Ýtã:í´ÓtüñÇëšO}J?þ¸î»÷ÞFWU–J¥”J¥äº®ú;L‹—ôkËæ›Už È`Îpž‚‘ØA·+— *åsü»cQ¶ïû’¤ÖÖVyæ™úȇ?¬J¥¢÷þýßë¯Þñ}ë›ßÔß{®>ññ[äŽùâ÷Þô&­\y¡ºººôßÿ¾¶oß>«üÀœqÆÿù¢š:zº]¥\Öw×®ÖØ‹¿­zŽ>úh60 n¼qïg<òHÕËÁÜôëçžÓ‡W_*×uõÁU—è´ÓO×w¾ýmëüÀœ1“ÁXIr5µuUu@¶R.K’ÇѳÏ<£O]sMÕòÆüS©TôóŸ=¦ãŽûƒYåãV©>À¬MìÜ:£íŠù¬’#;«Zöa‡&Izö¹çôû+VhñâÅ{ÿ‡%Ižçíý7žÖ¶69Ξ ¯Çщo>I¿}þùYåɲ˜3î¿î↕ÝÕÝ-Iš×§o¸AŸ¸ê*I{Ö£½í¶ÛôôSOéÞuëúõúá¨ûÆ7VWÔÆòåËõ®³ÎV¾PPÀqôô3Oë?x`Vy2 €…祷M|xõjE£QIÒÏþsýüç?Ÿ¶Í¿|õ«ú—¯~uÖÕÃÜôȬG~üãªæÉ”ÅP# È@0 5€,Ôˆ×è S&‰ªäS*•ŒÓ¤2å‹Åª”Lá Y¨d F€a@j„Yà5´··7º ˜ÇÀ‚ã8Žqß÷§}‹ÅtË-·å‹Å´qãFãòÑx‹õéšk>¥¾í³ºã _ÔUWý“Âáð¬òd@8€L&£óÏ?ï¯[·®µA­¥Ó)}ùË_ÖÞÿ>]táJUüŠÞò–·Ì*OdIçœsŽ>÷¹Ïé+_ùŠÞøÆ7JÚ÷m׳Î:K'žx¢Ö®]«³Ï>[’tá…êŽ;îпøE]yå• «;ª#™LjÓ¦亮–.]ªÃÐï~÷»YåéU©nÀ¼öÐCéž{îÑë_ÿz]ýõ{]§Ü}÷ÝZ¹r¥V¯^½÷³»îºK_øÂ$I·Þz«?üp ×µÞ¨®åÇ£|àƒêééѿ߿^|ñÅYåÇ€,æ 7à( t»r©¢b®TÕ²wîÜ©P(¤^xAÁ`P---*—ËÜÞq]pÁ:ꨣ”Édtä‘G*3 ;Ï=óôÓúǸH®ëꣽ\gœq†î¹çëüÀœñw7ü?jél:èv•rEßúÔÞ:¾ß¿{ž§B¡`]ÇqT©T^s›ÓN;M‹/ÖªU«$Iëׯ·.sO¥RÑOý‰N<áÄYåò˜3f2+InÀUSGì€ïîî6.{É’%’¤#Ž8B¹\NétzÚ6@@‘HD’ǵk×.IROOV¬Xa\&æ–ööv9Ž#iÏ üÿñ[ô«_ýjVyò†,挱“êXÒzÐí ¹¢’ÃÓL§ôööjëÖ­Fe¿ímoÓŸÿùŸ+ éꫯÞï66lÐwÞ©x@÷ÝwŸÖ¬Y£Ûo¿]©TJ>ø Qy˜{~Å ½çïÞ£\>¯€ëê‰'ŸÐw¾óíYåétuuùUª õöö*™L*“É4º*0ÐÑÑ!ß÷5>¾ÿ)07577+2oÿ<‡ÕÙÙ©ÁÁÁFW\×ÕÀÀ€¶lÙÒèªÀÂÒ¥KµyóæFW†488¨R©ºëæ ¶úúú4>>®\.×èªÀ@gg§ŠÅ¢‰D£«­­­òmÛ¶­ÑU¡eË–iÓ¦M® õ÷÷khhHÅb±ÑU¡%K–hddDù|¾ÑUYЉ„ñ”Åñx\¡P¨F5¡Š)‹ F€a@j„Y¨d F¼FW˜ÒW%Ÿl6«B¡`”¦)USSSUÊÇ¡g"‘Øïç¼! 5€,Ô²P# È@0 €DZHãW½²ÀAÝ{ÿý3Þ6ê«_ûZ kƒZinnÖû?ø!Ý´æ3ºyÝ­:ÿ½ïuž^êà|Ÿ÷mç£r¹¬‡ú‘n{ê)9Ž£O]wÞtôÑzîÙg­óä Y@ÒÑË—ëªú'IR8Ö_ø‚/^üšiÎ=ï<­½ùfݲn.]½zïç®ëê’K/ÕšµkõϷݦ7uT-«Ž*Éf³zú©§$íTß½{XMMM³Ê“7d0g8®äþN¡_öU)U÷-ÔgŸyFÅbQÿëOÿTË—/ׯ{îÑàààk¦ùÖ7¿©¯ýË¿H’®¿áõ÷÷kttTýýýú?Ÿø„¶lÞ¬×-]ªO|âúÿþï«Z_ÔVKK\Gu”>÷ÙÛf•²˜3ŽŸŸU^ È`ΘÉ`¬$9®£`S@¹‘ê–‹Fåû¾â­­r]W•Jå€ÛþÙ)§hÑ¢EúØå—K’n¸ñÆWTÐÙg[×uYWvžƒºücWêûßýŽžú哳Î5d0gäÆgöÆk¹XQ!Qªzù—]~¹ÖÝr‹þçñÇõžsÏ}Ím[ZZ´{÷nIRww·–/_¾÷o]]]zýë_/IZºl™r¹œÒétÕë‹ê ƒúèWèü‡~òÈ#UÉ“7d0güî[¯½fk-tÒIÚ¼i“žzê)=ûì³Zwë­úÙcé׿þµ$éK_þòÞm7lØ ÿ|ðA]}Í5ºé3ŸQ:ÖC?¼÷ï?þ¸Î|ç;µhÑ"…B!}ú•oÏbÎ:ýô¿Ô±Çþ¾úúëÜóΗ$=óÌÓºý6ûudÀÂóª)ƒgâ§>ªgž~Z’T.—õEܹ¿ IDAT÷¿ïßþú¯þj¿i.ùЇöûùeþ°qùh¼{ïݨ{ïÝXÕ<™²j„Y¨d°à˜OX,ùU¯À€,Ô ²P#^£+L™H$ª’O¡X4N“ÉfU®TªR>0…7d F€a@j„Y¨dK±XL7nœöoÌ_‘HD—\r©¾~׿V%?d€ýX·nÝ‚.ûwÉ%—ꑟ<"Ç©N~^u²æ·÷¾÷½:úè£uõÕWëïx‡N<ñD­]»V?ýéOµaÃ]xá…:á„亮6oÞ¬k¯½ö5ó{ë[ߪ .¸@¾ï+‘Hèºë®ÓÈȈÚÚÚôÉO~R‘HD±XLßøÆ7‹Åö)ïÛßþ¶nºé&ýö·¿ÕÉ'Ÿ¬k®¹FmmmûÍïë_ÿº®¼òJmݺU’tå•Wêþçôýï¿»mÁ¹á†ë å¨:#²¼! €DZx½ñK_ú’¶oß®w½ë]ºûH$´zõjmذA’t×]w颋.ÒÊ•+ÕÛÛ«Ã?ü€yutthÕªUZµj•V®\©{ï½WW\q…$émo{›ž{î9]tÑEzÏ{Þ£x`¿åýáþ¡ž}öY}öÙÚ±cÇó»ÿþûuúé§K’€N:é$ýèG?2þþx™Íñs È`Îð媈ô¾¬zÙçž{®–/_®R©4íoŽãè‚ .кuëtýõ×ëÈ#T<?`^ÇsŒž|òI¥R)IÒÃ?¬cŽ9F’ôè£êä“OÖe—]¦eË–©X,î7ÉÉIýà?8h~ßûÞ÷tÊ)§H’N8á=ùä“Êår–{ÕÆ”Ř3²o|·j9èv¾_Qäù{ÈT­ì¯}íkºûî»÷û·ÓN;M‹/ÖªU«$Iëׯͼ<Ï;à[–ÃÃÃ:ï¼ótòÉ'ëãÿ¸¾ûÝïê›ßüæ´íÒéôŒòK&“úÍo~£?øƒ?Щ§žªï~÷»¯Y7ÔoÈ`î˜Á`¬$9Ž+?Ô\“*D"I{¦ÿúw<×®]»$I===Z±bÅkæñÄOèøãWKËžïóö·¿]Ï<óÌ>Ûüä'?ѧ?ýi|òÉÓÊ3Íïßÿýßuê©§êØcÕc=fú•QC¼! €9ÃÉÉtt;¿\SHTµì /¼Pñ¡5kÖè‰'žÐ† tçwêÐ}÷ݧ5kÖèöÛoW*•Òƒ>øšyiíÚµºí¶ÛT(”H$tÝu×I’ÞúÖ·êoÿöoåû¾<ÏÓºuë$iŸò^ý¦îkå'í™ù²Ë.Óÿ÷«R©Tu¿`vœ®®.¿^…¹Ž£ÃúÚÓUüŠ\ÇüeÞŠï˵Xp×¶<_’Ii]]]J¥RVsxW*¹®Í>±Ü—òå};É÷}«í¿›m{›¥kmm•ïûšL$ ÷È,êh»Oê¸/Mÿ—˪ÏùÝÔÔ¤H$¢ááa«}bs<Ûœ7Òlö‰eºŠ/×­ÓùmØn¡PHíííÚ¹kW}ûs‹ïg¿OêÜÞ–ý‰@  ¾¾>½¸m[]Ûma·w}bÇqÔß߯·m3¿ÆYô%RÎÓ,^¼X»†v©R6¿Ù²¹†Óì¯,óc²»»[‰„Šù¼yy–ûd^Ä4ÖljEL#óönooW¾W&1LÙ€{Ôyq«Ïµ±¥¥Ežçi||¼æe½œŽ˜fz:³}‰DÔÒÒ¢¡ÝCuÛ'Ä4û)˰_êééÑŽÁÁº<§™BL³/›ýqØa‡ië‹[ë{ÏRϘ¦Þýybš¾¾>íVy?k]´¬:=O}9ÝB¾Æ™§[´h‘FÆFU*ìÝÐj³i·ŠïkÛNóøi.±ƒinn>àªóÁm·Ý¦þçÖ¯~õ«FW¯P×7d[š#ºñ£mœnû® õ/j3N·eû¨^×ßiœnh8¡Þî/Â| ¥REž7óN7 i÷hBm-æ'öÖc:|ÉÁòj/Žk`±ù ød2§VÃzf³E£!㲇&µ¸·Õ8ÝÖíc:¼ß|ŸìžÔ¢î™— îY$<“Î*2;…Æ&2êh‹¥‘¤Ç4°Ø¢½wŒiÀâ8±©g±XR0hÞ¥˜îÿ)[¶éuí´eÛ°Õñ•͘Ï6ç$m×açéÖ£:|‰yŸ72–RW‡Ù´~E²ˆM54’To×̦‘$×u õ›­úsÛëG*“Ws,l”&™Î«¥É,$mÛ9nõc%Ós`ŠiØpG‘HD[·íVEY¶ßÍv_Ú´]*SPsÌü7bšH$¢T*cÓHÒÈxJ]íæSÙö]¶í½PcšH$¢w «§Óüœ+JÄ4¯PϘ&ë…­»Õ¿Èü8±=¾æGL3®Ã—˜§³é‡J¥²™Q{«E{ï×€ElR¯˜&‰(“ÉZý˜Äö1Ít6ç@$Ñöcêj7?.mØÄ4ÅbYç~ø«5ªj¡¿¿_ñxœÁØ9¨®oÈb_½½½J&“ÊdÌYÆéèèïûV¿¬Fã477+jxx¸ÑUp8¬ÎÎN 6º*0ຮ´eË–FW–.]ªÍ›77º0400 ÁÁA•,~ÆéëëÓøø¸ÕŒ9hœÎÎN‹E%Õ µÕÚÚ*Ïó4::ÚèªÀ@$Ù3cÎή xž§¾¾>mÛ¶­ÑU¡eË–iÓ¦M® õ÷÷khhÈêGGh¬%K–hddDy‹s0s‡Ò²×_½;ì0]wÝuzî¹ç]¼ kÈóØW\Ñè*à5XL8 ˜ d F˜²sF[<^•|Š…‚ñ²ÑHD­U*‡ž‰Db¿Ÿó†,Ô²P# È@0 5€,`¨­­­ÑUÀ<Á€,púÜç?/IŠÅbºöºëšæÞûï×gž¹ÏgûøÇõ¦7½©&uDu„ÃaýÃ?^¬Ï~þŽªäÇ€,` “Éèýï{ßA·Õ;ßùNu÷ôåíõ×ÛV Uð¿O?ûÙcrœêäçU'`~;óïÔ›ßüfÝtã*‹úóSOÕ™gž©D"¡çŸ~ïvÑhTŸ»ãî¹’¤sÏ;OÇwœ\×ÕÖ­[uóÚµ’¤R©¤¯ýëºtõj}ìò˧•wÒý‘Î:ë,¹®«á‘Ýtã:í´ÓtüñÇëšO}J?þ¸î»÷Þú|yìuë-7+ ÊQuFdyCtÏ·¾¥ƒƒú«w¼CzϹçjõ¥—ê²|D“““L÷­o~S«/½T—¬Z¥žžõ÷÷K’‚¡þë?ÿS’ô¿þôO÷IÓÚÚª3ÏþqcÞÀœáú¾B~å Û•ä¨ä¾Æ»‡ó;ãïÐßøF=òÈ#ú½7¾Q¿|òIe2IÒ£?ù‰þôUƒª{Šqtλ߭#Žø –sŒnúÌgôþ~P=üð~óö}_7Ýt“–¼´¾ìÄø¸>}à úÄUWéöÏ~o¹’tïÆºuýzóîwWõû¡1œ®®.ÿà›¡z{{•L&÷Î=Žù¡££C¾ïk||¼ÑUææfE£Q 7º*0‡ÕÙÙ©ÁÁÁFW\×ÕÀÀ€¶lÙÒèªÀÂÒ¥KµyóæFW†488¸ß›BÌ]}}}W.—ktU` ³³SÅbQ‰D¢ÑUÖÖVyž§ÑÑÑFW"‘ˆÚÛÛµsçÎFW<ÏS__Ÿ¶mÛÖèªÀвeË´iÓ¦FW†úûû544¤b±ØèªÀÐ’%K422¢|>ßèªÌIm/­¿:[#££š˜œ4JÓÕÙ©¶ÖÖª”CÏÄîyCj„Y¨d F€a@jÄkt€)‰DUòÉ Æi²¹œä8U)˜R×ÙX(¤ O:É8]2—SK$bœ.‘Ë)n‘.Ï«)6NWñ}¹'iSS“&Ói«FHd³ŠG£æéòyÅ-¾[®XT$4JS*—åÆe¥òy5[ÔѺ½ 5…B3Þ>Ê÷}¥³Y ;ål¡ ¨AYS’ù¼Z,ö‰í¹cSÏR¥"Ï5é>S((f±OLÛ; Éó<í·:¾Šå²‚†Ç³Íy#ÙŸ§¶ý‚M˜öwSLû×@  X,¦ýýVç·í9P(—2lï|©¤°gÞ£Ûžßõlommm\´Èîü¶ün¶ûÒ¦ílŽi~Ä4mmmëï7>Ç­ûsbšilÚ»µµU»úûµè‡Ê¾OLó õŒiš››µ{bB1‹v³=¾æELcÙçÕ+¦‰F£Jåó T*Fé$ûïFL3i{‡Ãa¹®«l6[ó²¦ÓLgzxž§H$¢¡»ç42ŸŽ˜f:ÓkŽã8jiiÑö¾¾º<§™BL³/›˜¦½½];zzêòœfJ]cšBA›ï6Çcšx<®D2)ù¾qY¶ÏÁ‰i¦³¹´´´htrR!‹û6׸R¥¢Û~üãÕ8´Ôu@¶R©h—ůr¥’Ò¿bÈ‹ÊX¤Ë—JJæóÆéLoæã’’™ŒüRɸ¬L±¨L±hœ.[,*cñÝl‚Û‡YÙbQ)‹:fK%ûö6¸87•Ë’¤d*eüð¦P.+”Ë¥‘öì“´Í>)­Î›zÚÐÙG¦í‰D 5œJY_%ß—gøýlÎÉþ<µíòå²Â†ííK²ù˜iÿêyžš}_#©”Õùm{ý(W* ö_³éólÎïœe{J%…,Î9®ëª i$•²*+W*Y_ãlö¥MÛÙ#ÒÜiÇQ)ÒîDÂüW©X]ãˆiö“Î"¦)ƒM§¯U’Ý5œ˜f:›˜¦Õq4žÍ*añðÌöøš71M{[ôC6íÝT.+[(¨bÑwe bšW©WLF庮ÒétÍËšBL3éù +—5’N[=§±¹o±½G%¦y™ëºÊÍdêòœf 1;löG)Òp*U—ç4{ÓÕ;¦±lï¹Ó'¦™Î&¦ÉM§åZÜذ‰iJÇ€ýsºººês¶cšÞÞ^%“Ie2™FW:::äû¾ÆÇÇ]hnnV4Õððp£«ápXltU`Àu] hË–-® ,,]ºT›7ont5`h``@ƒƒƒ*YüÐÓ××§ññqå, ¢q:;;U,•¨Òj¨ÖÖVyž§ÑÑÑFW"‘ˆÚÛÛµsçÎFW<ÏS__Ÿ¶mÛÖèªÀвeË´iÓ¦FW†úûû544¤¢ÅBÐXK–,ÑÈȈòÀ˜¹t:mïÂÀ!ˆYÀR{{{£«€9ŽYÀB,Ó-·ÜÒèj Ê"‘ˆ.¹äR}ý®­J~ È2™ŒÎ?ÿüšå¿nݺšå»ä’KõÈO‘ãT'?¯:Ùó[,“ïûŠÅbºõÖ[õÜsÏéMoz“‚Á Ö¬Y£•+Wª­­MCCCúèG?ªh4ª»îºKgœq†b±˜>ûÙÏê׿þµ?üpµ¶¶jíÚµzüñÇ%I^x¡N8á¹®«Í›7ëÚk¯}Í4gu–N<ñD­]»V?ýéOµaÆýæê»á†ë å¨:#²¼! €9#èHm^à ÿ‹¹Õæú“?ù“½ÿ>î¸ã´qãF­\¹R>ø ®¾új]vÙe:ÿüóåyžŽ?þøié=öXÝsÏ=ºøâ‹õÉO~Rÿøÿ¸÷owÝu—.ºè"­\¹R½½½:üðÃ_3ÍÝwß­D"¡Õ«WkÆ ¯™ªÏ©Öë±â YÌ!÷÷{Zt»²ïë¼§~«_erU+»··wᅦ††´yófIÒ¶mÛôÔSO)ŸÏK’¶oß®ÎÎÎi釆†ôüóÏK’6mÚ¤îînI{÷.¸àuÔQÊd2:òÈ#Ç5<<|À4¯v <0÷1 €9c&ƒ±’põ†ƒU}¥©Á×)Åbñ ir¹ý×å´ÓNÓâÅ‹µjÕ*IÒúõëšÆ$ÌmLY €9ã…°fJeíÈxÔfÊÙ]»v§™‰x<¾7ïžž­X±bFé€"‘Ȭò@ãñ†,挳~ù|ÃÊ~衇j’ï÷¾÷=­Y³F·ß~»R©”|ðÁ¥Û°aƒî¼óN=ðÀºï¾û¬ò@ã9]]]~£+q¨êííU2™T&“itU` ££C¾ïk||¼ÑUææfE£Q 7º*0‡ÕÙÙ©ÁÁÁFW\×ÕÀÀ€¶lÙÒèªÀÂÒ¥K÷®‚ùc``@ƒƒƒ*•J® ôõõi|||ÆSSanèììT±XT"‘htU` µµUžçitt´ÑUH$¢öövíܹ³ÑUÏóÔ××§mÛ¶5º*0´lÙ2mÚ´©ÑÕ€¡þþ~ ÍhUÌ-K–,ÑÈÈÈ´)qQ]™LÆx &‹)‹Õ¨F8T1e1ÔH]§,ö‚½áØ#ŒÓU*¹®ùØq¹\V 0NçW*r,Êó}ßh>òööv¥R)«_/Ù~7ë}bøÝ$©âWä:íV©(PÇö6=¾âñ¸|ßW"‘0ß'å²\›:Ú¦«”åºõ)¯âûr-æã¯×ùF‡Õ1Öfu|YϾ/ÕqŸTʹ›¾«"Çø\õ%™7Óþ5 )«¥'fy~ÛVûIJ½Ë•²u:O%©Rñåºæõ4Ắz{{i É Xœ–ßÍv_Ú´Ýy3÷cÇq´hÑ"EÚƒu»îÛö]¶ûr¡Æ4½½½jé‰É÷Í'¿±Ú'Ä4ÓÓY“šœì°z³Ùöøš1u\oñÝ|ùr cšÖÖV ye³æo6Ûß³ÓLKgÓ477+hr²Ë¼¬²OLó*õ:¿C¡ZZZÔ¶¨Ùê9Í}‹õ>!¦ÙËó3ÙÄ4•JE¿~â·5ªph©ó€lPoùßo6N—˜H*ÞÖbœnbtRm­Æé’“)µ´6§3í¬£Ñ¨&Ç“ EÌ›artR­ßmb,¡¶Ž¸qºl6¯h4l”¦X,* —•˜H)Þf¾ÿmÛÛôø …B’¤L&+Ï3»ÈfÒ9Åš"Fi$ir,¡V‹v³MgSÏR©l¼?¤úßžçÉó<íÞ5bu|ÙÏÙL^јÙy#Ù·ÛÄHBm]æéRÉ´š[šŒÒØÞȧi5Çg^V P8Öà¶®ºœßS ù¢Ba³öÎåòŠD,Ú{<¡ÖvóvT»Å>1mŽã¨©©I½ƒVeÙöç¶ûÒ¦ílŽi~Ä4---zÝäãÐt2«¦–¨Qɾï²í+jLÓÔÔ¤¡]ÝÆý¹dw '¦™ÎæüŽF£Þ5¢æVóv³=¾æCLc{¯cÓÙ/yf§P)•ÖPÌ<Ð/Œj¨½Ó8?1©p‡ùIåtFù&Ãö6<þ÷–5™P©Õb:®‘aíì˜ù9ðrGÙávÛÌÏ`Yr §Â©dsr£æAmqlBƒïörºq•;ÚÓ &Æh6ë‡l×U*O&mŸùyê8Ž’ž§ü®!«þ|çèˆ<‹>¯’ÏË ›¨•\^›þ|lBe‹ö.Œ©Òa±O&Çh1¿Æq¤p(¤ôȘb­æÇ¤íõ»4>¡r»ù¾Ì$åFÌÎÕr>¯€á1"IåñIE;ÍûeÛ}RN$UŒ›µw>V.‘c8½Y9™Q¡Åâa¢å±œQÀ"^X¨1M.RndLù¸y?¤RÉ8¦)§2Ê7[´÷ø¸Êíý‚eº¹ÓdƒAåw(oq­²=¾übqÎÇ4%˘¦’Ψ`ØÞ*—%Ã)‹3ž§ÒdRj²x˜h}›T©^1e{×;¦)'S*´Ì¼Ï öÜX­ÙlXÖ”zÇ4•\®n1M½žÓ8®#/à)7:fÓH’_ñå®YJ&•·ˆ—mcšÒø„6íÉÉ5œâ²R(Ê ™F™¶·ã8ʃ*îÜU—ç4/'$¦y%›˜&+¿{Øê9Mqt\‰NóïVט&“QÎâ·âظ*±I½bšl(¨b6gÓHv÷Œ1ÍþØÄ4ÙPPù± ¹Íµ]ZjŠMLã—JÒ:dj¨ï”Å®«øâãd6‹ÐïIg·Æ¡my¦oŒuvv*•N)Ÿ3Ÿ’Àþ»Ù¥³¹‰ñå˱x‡®Rñå–%Ù/BoZ^<¾'(ML&Ì_¬øR¿›m:«zZ¾2>ЫIDATY¯öŽÅbŠD"µ+Oæ_Ïæ¼‘ì÷I=Ïoëö6ì_C¡Z[[5´{hN÷ç’ý µéì S*~Y®c~³e[ž ×uµhÑ"íØ±c^|7›¶³¾ÆÍñ˜Æq-^¼XÛwì¨Û9`ýÝ*ã·x¥…Óôõõi÷Ðn•+foñî)PÄ4û¦ºÅ4ÝÝÝšœ˜T¡X¨KyÒi¬úsóýÑÖÖ¦b±¨t:m˜rîߣJ 7¦iiiQ ÐÄÄDÍËšBL³¿tfç@8V<×ÐîÝVåÙœÖ}1Í^@@ÝÝÝÚ98X—ç4{Ó¼ª0ïþþ~½øâ¶9ý\noy²Ù,Û»îÏa ûóÞÞ^ŒŽªlñ££¹~:e¡Æ4===¯ÛtÓ6ßÍ÷}%wl­Q€CK]ßU¥¢Äö-u-r.‹³J³†ì¼ã½´†l‚5dç•Js³ÊѨR¬!;¯„Ãa…rJ±†ì¼âº®ÚÜ û<ÕáIIâµy§Í­(ɲóNS9¯kÈÎ;Á,kÈÎGÎKkÈ&XCv^‰D"ò2íJ±†ì¼âyžš+%YCv¾É…\¥¹›oâ*)ŲóR‹_TŠ5dC†ÅO²3Qß5d#QsÞ…ÆéòɤÂëw䓊ÄÍç¤/dÒ ÅÌçm¯”Ër æêojjRfrR¾áú’”ŸœT¸Õâ»% ÅÍ×(åròL×¢)0\ËA’ò©¤ÂÍæíOL*lÑÞÅTJAƒõ3#/í‡L*-×p}½R6'ÏbíÛï–O&n1oïr.§€a{WJeãý!™ïÿ)¦û$ * ª{÷BÇ—ÍñlsÞHöç©m¿PÊfä®§(ß—,¦o1í_€¢Ñ¨âƒ;¬úsÛëG¹PTÀpm¥r.¯@Ä|ý­B2¡ÅyjÝÞ™Œ<‹5sL8Ž£––5ïÚeU–õ5Îr_Ú´]©P2_|>Ä4­­­j3Ši$©”ÍÊ‹š¯§HL³Ÿt×ýx<®Ö¡!,ÚÀæNL3MLÓÔÔ¤äȰ\Óë°¤B*¹pcËãĦ2½‡“¤h4ª|*¥ŠÅ:m¶ý91Ít¦1M8–ëºÊf³5/k 1Ít¦ç€çy ‡ÃjÞmõœÆfjFbšéLcÇqÔÜܬæÛëòœf 1;löGkk«¢;vÔå9Í”zÆ4å|N°M{'žÃ1MKK‹º“IÙ¬Khûœ˜f:›ë@ss³ºFGåX¬çnÃ&¦©”JzêKŸ­Q€CK]dýJYã¿ûqºr± LÐü¡TÈ+2ïÌ*Å’Ü Å®1\‡ ÒÚªl*¥BÙ|­¯R¾ oØ|Ÿ”óÂæél‚8¿\‘0 »\((cqCXÊçåY\¼L/èMMMò}_éTÚx½–r©¤€Å¼í>)òÊXœ6õ´]óÃ& ’ÌÛ;‰( )12¢€Å¾´9žË¥²tmŠ” ye†-ú¼RI®a{[ŽÇª\,)`пzž§J<®ä®Vý¹íõÃf'Ûø¶ýr)Ÿ—gÓÞÅ¢\‹‡0&Ç‘ÛÙ©É;­Ê²ýnõ¼ÆÙ®õ5b¯»[“C»×V²Ÿlû.Û¾r¡Æ4ng§’ÃÃòë´1Í~ʲˆiü¶6%ÆÆå[•WX°1m\oÕY¬%WlnV1_PÞbí_Ûþœ˜f:Ó˜&*(•JÕ¼¬)Ä4Ó™ž¡PH±XLÉá«8Ãæ¾ÅæþH"¦y%×uå´·+18X—ç4SˆiöeÓ{z4¹}G]žÓL©gLc}~ç ÊØ^ãêÓ8šŸPÙ¯—eúœf 1Ít6×}§£C‰ÑQUl²Y°‰i|‹± ûW×ÙJ¡ ­ÿõõ,rNëííU’5d玗Ög Ùy¥¹¹YÑhTì!;¯„Ãauvvj5dç×u¥mÛ²¥ÑUwéRmݼ¹ÑÕ€!`@ƒ¬!;ïúú4βóNg'kÈÎG­/­!;ʲóJ$Q{{»v²†ì¼âyžJ}}Ú±5dç›À²eÚ¾iS£«Cåþ~ ±†ì¼TZ²D#¬! 2ê: ë¸R|±Í3vobù•=eš'”dSža=›:ÃrZÊ æ, «ÈjàúîKG²™,Ãvÿ[¶·é>inÈ÷}UbMÆõô}GŽc±O,Û»®ÇIΛ½é Û;‹*«2o·=Ìçz“³-O¾#™—–ímš. ©©-¬¸šêº/mÎûýoWIûã˲2ຮb½!Å‹Mu>–ë¸/çÅuXÆçœã8Št{Š,Ú®Þ×ﺦ›û1M¬7¤5©R±µ¨'1MuÊŠu…TŠÄ.šÿrßúZ<bëãÄ"¦±©cs[D¥‚''nþ¶À|Ø—óâ:,ó~¨¹9²g(:žIÓL‰D"Š5‡ÔêZÞÇÙô•Ä4û)LFûÄó<źBŠ—ë|GLóªD2Þ‘nOñ|½ïãT·˜Æêù‡fñÝêÓÄzCŠ{M*•,dçøsؽhLÓÔV>S¤XŸa»¾ÄÑäóFLçtuuÕö©ì+„ca½ùïŽ3NWH–j±Xgu¢¤p›yºbº¬`“ÅCÃ鮼€§B¦$×bŠø|¢¤pÜbŸX¦+ç+ „ §…(Tä†Ì¯zÅTIÁfó:&‹ µšO©bZ^À È—¯r±,'`8N¶¢@Ô|ŸE…âæß­()dÓÞ6õ,ù’g¬Ô«½]וã8ÊNæ²(Ï/Vä §÷³8o$)Ÿ(*lÑÞùɒ­ÓÌd+ò,ŽK…LY¡ØÌûW×u庮Ò#Y…Ûj~O©}¹AÃó;WQ bq~[^ã “e…Z-¦ÌTäÅjÛÞŽãÈóůTäÌe z*ä²r¯\JÁˆù>±Ý—åb^ ÙÈq¹RTÀµYs"-/lþ«åB6¥PÔü»• Yyííö È‹%ãµ lö£4?Ú»â—å:6k‹™íÿ)¦í=u#ŸËLÊ ™_•JI®kÖe– yyëir)…,Ú»O*n1NW.æFŒÒøòåXü„²TÈÉ Í¼,Çqô<¥’£Výy!ŸVÈ¢?ñË%9³ö.—ò xí]H+dqLó Ãæû¤TÌÊ šŸsf|…Ãa¥’“V×Ób.©`ÄüX¶Ý—6mg»öÐ|ˆiÂárÙœQL#Íâ°ì» ¹¤BÇÉBiB¡ ré¤\Ãþ\²[‰˜f:›˜&ô”Ë$Æ,ÊK/ؘÆö8)— xfë}Ù Èz€ Åœ\‹~Á¶?'¦™Î4¦ \9rT²µ}F@L3é9°ç‡~eÒI»ç4÷-6÷G1Í+9’‚¡ R“ãuyN3…˜f_61M8R:9Y—ç4SêÓØÄ ’}»Õ+¦ …‚*ä‹VoºþßöîõGªúŽãøç\æ²÷BA„Å5Õ*±X›4‘>ÀD%1⃚šÐÆJªM*x«»X¯OÊ¥\4›j/IÛ¿À[1j”>PŸˆ\Ô’ò@X²"÷]vgæœé²48;ÊùιlgÞ¯gN8žó;Ÿýó9sfÎD}Ÿf¦–¥Óäs9Ÿ?'×°–NS CIÜâê YWcšSøWäåJN |Þð©qU”/.,Ü@¹\ôõ…aUn„O"uttè¼?®0Œ~AXr*Êç ŸÔQ |Á06?ëE[. B¹ßܤ’(oØÿN ‚áï$jÞmmmªV«;)oI*{¡r¾aŸç€yŸ¶Órá#Ùç[Ô±åóyù¾¯SÁYÓ¾ ƒªÜˆŸ´µÌ©cž[Q>gø†¬Êø©Rëc~Ê^ œùcóQVD, ù:ŽNS#ê1¶X(Èõ<ÖÒi¾$­Nãû¾ŠÅ¢N§M×–ë–Š[•oøÖ0æÇQww·FÊ'RyŸfæR–N3cÆ ”§ò>ͤ4;MÅ«Ê7< Åz=–V§éîîÖ™3gey$yÔ÷i&ÑijYÎûÝ]]:팚®,,&ÒÙ6 ¤úÈâoÏý¦t/òr¹œ£r9úfæ ŽÊÑ—ó|WA%úÆòK®/Y~êËË{ JÑoäz9WA9úØ<ÏQDëJ¡áxó•+ÑsË•Ly; ës]Gam9ß“*Ñc“›w– ¹å]†å|ßQ%â>q O펼®œ£Ša~[ó¶O,ãs=GaÄy#Ù÷‰õ¸`ÚN§zá͈¬óÍz<·æí{Ž*÷IÎsT¶äwT)Yö‰§ò„!oßQhÈÀš·_ðT1Œ-—wT¶ìKCvæs¦v¹œ«ÐÐM¬s‡NS‹Ns©ô;«ÒDô±Ñi¦XÎ0\]øI²Èë2^WÑi¦X¦¦–µÓX8ž£ªaÐijÑij5w§™þïÓXæ$y9OAÙÐMþ: ïÓÔ®‹Nsé2ªê•ïLh‹€Ö’ê7do^د«|+ú‚ù’TŠþ8 §8¡j)ú×ý«^IŽa}U7”FüT[–JÑS-ŒË)EœD5?!ǰOÂ|YnÄí¬úœŠáwÌr¶mTqB²,—³ý}U½PNñ™ûÛß– ¶±U ¶}YuÊr¢æírBKÞÆ}bÎ{\²ÌÃß³eÞH’“·»Ìû¤Í2 ?Æ$ûñÕ:¶jÞ¸¾\E*GzTÃÃÃ5ËÞsÏOµzõj-]¶TCGŽhddä+_G|âÎíŠ+®ÐcºýöÛu׊»422¢£G¦=¬¦—Ä|›´ý¹ç5cÆ íÛ·/•±´’$rëííÕÀàzÝrë­š{å\íÝ»7Õ1µ‚¸ssG>úKÝqÇR-[¶Lù|AH{XM¯‘ܦZV¢—¤%îìè&éIbÞM¢Ÿ$'‰Üè'É‹;7úI:¬¹}Õ¹Œ~’¼¸s£›¤#‰ù6‰^’¬$²£›$/îÜè&@óð³Þ€fôÀÚuÚµk—:;:/¾vÛmKtdèˆ6mܨ¶¶6mþÍ­}àªV«ÿÍ5×\«k®½V<ò°:::´uÛvÝßÏ꾎xÅÛÙsç´ã…422¢îînmÛ¶]kÖÜ›ÅКZܹMúÁÝwëĉ/RK+‰;7ß÷µaã&ýêñõ:|øpCj qçvýõ×Ëõ\=ùärGüÓŸõê«ÏbhMÍš[½eé%é‰;;ºIzâÎný$YqçF?IGܹÑOÒaÍ­Þ¹Œ~’ޏs£›¤#îÜ&ÑK’wvt“tÄÝh<²8Ï>ótÍ'ÆÚÛÛ5::*I—ïûêííU__Ÿ~ÿÒË’¤… êý÷Þ“$ŽŽêÔÉ“š3gNÝׯ¸s;?6vñ¹¹\NgÏKq4­#îÜ$iþüùê_د·ßz;Å‘´–¸sëïï×Þ½{¸ HXܹ ©¯ïj]wÝuºå–[õé§Ÿ¤; aÍ­Þ²ô’ôÄÝ$=qg'ÑOÒwnô“tÄý$ÖÜêËè'éˆ;7ºI:âÎM¢—¤%îìè&éˆ;7º Ð<ø†lJvî|]O=õ´úoì×è訊ł‚ Ððð°6oÚ$Iêêîºä„xöÜYõôôÔ}ýرc©£Õ4’Ûd>ŽãhíºuúÃË/e2†VÔHn###z`í:mÞ¼I߹ᆬ†Ð’É­··W³gÏÖúõ««»KC‡‡ôâ‹;²JKiô8¹ëÝwõÄ“O©X,jýà`VÃh9—“[=ô’l5’Ý$ºI6ÉÎqúIFÉ~’Fr¥Ÿd$Jn_>—ÑO²ÓHn_÷:’ÓHnô’l5’Ý$;äF7š7dS266¦ÁÁ‹ÿý—¿þMŸþ¹*•Šü$éôéÓ—<Ê «³KgΜ©û:’×HnÒ…èczëÍ7µÿþt7¾…5’ÛÊU«ôÆ;õÅñã©ow«k$·ññ }öÙ!íxá·’¤_oØ ¾¾>:t(ÝA´ Fr[´èûºêª«ô“¯ÖÌ™3µqÓf=üЃ:Ç'ãw9¹ÕC/ÉV#ÙIt“,5’ý$;äF?ÉN#¹ÑO²s¹¹Mu.£Ÿd§‘ܾêu$«‘Üè%Ùj$;ºIvÉn4Yœ%K–èÓO>Q¥R‘ïûZ°`$i÷‡ê¦E‹$Iš5{¶Ž;V÷u¤+jn®ëjpp½víÚ¥wÞy'ËMoiQs›;w®–/_®çž^÷®Y£+îÒK—f9„–5·ýû÷iÖ¬Y—/Û411‘ɶ·2Ë|;xð $éĉ:uê¤:;k3ɪ—[=ô’é#jvt“é#jvô“é!jnô“éÁ2ßè'Ù«—[½sýdzˆšÝdzˆš½dúˆšÝdz°Ì9º Ðø†lŠž~æYår99sZÛ·o“$Í›7O>ô°~~ÿ}:tè>þx¿¶lÙªB±¨ß½¸CÕjµîëH‡5·•«Vé¦E‹4¯·W«VýH’´iã e9œ–aÍmÛÖ­ÿ‹/VïüùúÇk¯e5Œ–cÍíÈ‘#Ú½ûCmÙ²UŽëêƒÞç ˜Ys{ýõjpp½nüî*ä Ú³g†‡‡3MëøºÜê¡—dÏšÝW®¤›dÌšý$[ÖÜè'Ù²æF?ÉÖ×åVï\F?É–5·Å7ßL7É57zIö¬Ù ÑM2dÍn4gÖ¬Y4TH,€„pC YH7d !ÿê¦åæúr2IEND®B`‚prometheus-bird-exporter-1.2.6+ds/main.go000066400000000000000000000073161415316745700204000ustar00rootroot00000000000000package main import ( "flag" "fmt" "net/http" "os" "github.com/czerwonk/bird_exporter/protocol" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" log "github.com/sirupsen/logrus" ) const version string = "1.2.6" var ( showVersion = flag.Bool("version", false, "Print version information.") listenAddress = flag.String("web.listen-address", ":9324", "Address on which to expose metrics and web interface.") metricsPath = flag.String("web.telemetry-path", "/metrics", "Path under which to expose metrics.") birdSocket = flag.String("bird.socket", "/var/run/bird.ctl", "Socket to communicate with bird routing daemon") birdV2 = flag.Bool("bird.v2", false, "Bird major version >= 2.0 (multi channel protocols)") newFormat = flag.Bool("format.new", false, "New metric format (more convenient / generic)") enableBgp = flag.Bool("proto.bgp", true, "Enables metrics for protocol BGP") enableOspf = flag.Bool("proto.ospf", true, "Enables metrics for protocol OSPF") enableKernel = flag.Bool("proto.kernel", true, "Enables metrics for protocol Kernel") enableStatic = flag.Bool("proto.static", true, "Enables metrics for protocol Static") enableDirect = flag.Bool("proto.direct", true, "Enables metrics for protocol Direct") // pre bird 2.0 bird6Socket = flag.String("bird.socket6", "/var/run/bird6.ctl", "Socket to communicate with bird6 routing daemon (not compatible with -bird.v2)") birdEnabled = flag.Bool("bird.ipv4", true, "Get protocols from bird (not compatible with -bird.v2)") bird6Enabled = flag.Bool("bird.ipv6", true, "Get protocols from bird6 (not compatible with -bird.v2)") descriptionLabels = flag.Bool("format.description-labels", false, "Add labels from protocol descriptions.") ) func init() { flag.Usage = func() { fmt.Println("Usage: bird_exporter [ ... ]\n\nParameters:") fmt.Println() flag.PrintDefaults() } } func main() { flag.Parse() if *showVersion { printVersion() os.Exit(0) } startServer() } func printVersion() { fmt.Println("bird_exporter") fmt.Printf("Version: %s\n", version) fmt.Println("Author(s): Daniel Czerwonk") fmt.Println("Metric exporter for bird routing daemon") } func startServer() { log.Infof("Starting bird exporter (Version: %s)\n", version) if !*newFormat { log.Info("INFO: You are using the old metric format. Please consider using the new (more convenient one) by setting -format.new=true.") } http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(` Bird Routing Daemon Exporter (Version ` + version + `)

Bird Routing Daemon Exporter

Metrics

More information:

github.com/czerwonk/bird_exporter

`)) }) http.HandleFunc(*metricsPath, handleMetricsRequest) log.Infof("Listening for %s on %s\n", *metricsPath, *listenAddress) log.Fatal(http.ListenAndServe(*listenAddress, nil)) } func handleMetricsRequest(w http.ResponseWriter, r *http.Request) { reg := prometheus.NewRegistry() p := enabledProtocols() c := NewMetricCollector(*newFormat, p, *descriptionLabels) reg.MustRegister(c) l := log.New() l.Level = log.ErrorLevel promhttp.HandlerFor(reg, promhttp.HandlerOpts{ ErrorLog: l, ErrorHandling: promhttp.ContinueOnError}).ServeHTTP(w, r) } func enabledProtocols() int { res := 0 if *enableBgp { res |= protocol.BGP } if *enableOspf { res |= protocol.OSPF } if *enableKernel { res |= protocol.Kernel } if *enableStatic { res |= protocol.Static } if *enableDirect { res |= protocol.Direct } return res } prometheus-bird-exporter-1.2.6+ds/metric_collector.go000066400000000000000000000051411415316745700227770ustar00rootroot00000000000000package main import ( "github.com/czerwonk/bird_exporter/client" "github.com/czerwonk/bird_exporter/metrics" "github.com/czerwonk/bird_exporter/protocol" "github.com/prometheus/client_golang/prometheus" log "github.com/sirupsen/logrus" ) type MetricCollector struct { exporters map[int][]metrics.MetricExporter client *client.BirdClient enabledProtocols int newFormat bool } func NewMetricCollector(newFormat bool, enabledProtocols int, descriptionLabels bool) *MetricCollector { c := getClient() var e map[int][]metrics.MetricExporter if newFormat { e = exportersForDefault(c, descriptionLabels) } else { e = exportersForLegacy(c) } return &MetricCollector{ exporters: e, client: c, enabledProtocols: enabledProtocols, newFormat: newFormat, } } func getClient() *client.BirdClient { o := &client.BirdClientOptions{ BirdSocket: *birdSocket, Bird6Socket: *bird6Socket, Bird6Enabled: *bird6Enabled, BirdEnabled: *birdEnabled, BirdV2: *birdV2, } return &client.BirdClient{Options: o} } func exportersForLegacy(c *client.BirdClient) map[int][]metrics.MetricExporter { l := metrics.NewLegacyLabelStrategy() return map[int][]metrics.MetricExporter{ protocol.BGP: {metrics.NewLegacyMetricExporter("bgp4_session", "bgp6_session", l)}, protocol.Direct: {metrics.NewLegacyMetricExporter("direct4", "direct6", l)}, protocol.Kernel: {metrics.NewLegacyMetricExporter("kernel4", "kernel6", l)}, protocol.OSPF: {metrics.NewLegacyMetricExporter("ospf", "ospfv3", l), metrics.NewOSPFExporter("", c)}, protocol.Static: {metrics.NewLegacyMetricExporter("static4", "static6", l)}, } } func exportersForDefault(c *client.BirdClient, descriptionLabels bool) map[int][]metrics.MetricExporter { l := metrics.NewDefaultLabelStrategy(descriptionLabels) e := metrics.NewGenericProtocolMetricExporter("bird_protocol", true, l) return map[int][]metrics.MetricExporter{ protocol.BGP: {e}, protocol.Direct: {e}, protocol.Kernel: {e}, protocol.OSPF: {e, metrics.NewOSPFExporter("bird_", c)}, protocol.Static: {e}, } } func (m *MetricCollector) Describe(ch chan<- *prometheus.Desc) { for _, v := range m.exporters { for _, e := range v { e.Describe(ch) } } } func (m *MetricCollector) Collect(ch chan<- prometheus.Metric) { protocols, err := m.client.GetProtocols() if err != nil { log.Errorln(err) return } for _, p := range protocols { if p.Proto == protocol.PROTO_UNKNOWN || (m.enabledProtocols&p.Proto != p.Proto) { continue } for _, e := range m.exporters[p.Proto] { e.Export(p, ch, m.newFormat) } } } prometheus-bird-exporter-1.2.6+ds/metrics/000077500000000000000000000000001415316745700205645ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/metrics/default_label_strategy.go000066400000000000000000000034611415316745700256240ustar00rootroot00000000000000package metrics import ( "strings" "github.com/czerwonk/bird_exporter/protocol" ) // DefaultLabelStrategy defines the labels to add to an metric and its data retrieval method type DefaultLabelStrategy struct { descriptionLabels bool } func NewDefaultLabelStrategy(descriptionLabels bool) *DefaultLabelStrategy { return &DefaultLabelStrategy{ descriptionLabels: descriptionLabels, } } // LabelNames returns the list of label names func (d *DefaultLabelStrategy) LabelNames(p *protocol.Protocol) []string { res := []string{"name", "proto", "ip_version", "import_filter", "export_filter"} if d.descriptionLabels && p.Description != "" { res = append(res, labelKeysFromDescription(p.Description)...) } return res } // LabelValues returns the values for a protocol func (d *DefaultLabelStrategy) LabelValues(p *protocol.Protocol) []string { res := []string{p.Name, protoString(p), p.IPVersion, p.ImportFilter, p.ExportFilter} if d.descriptionLabels && p.Description != "" { res = append(res, labelValuesFromDescription(p.Description)...) } return res } func labelKeysFromDescription(desc string) (res []string) { for _, x := range strings.Split(desc, ",") { tmp := strings.Split(x, "=") if len(tmp) != 2 { continue } res = append(res, tmp[0]) } return } func labelValuesFromDescription(desc string) (res []string) { for _, x := range strings.Split(desc, ",") { tmp := strings.Split(x, "=") if len(tmp) != 2 { continue } res = append(res, tmp[1]) } return } func protoString(p *protocol.Protocol) string { switch p.Proto { case protocol.BGP: return "BGP" case protocol.OSPF: if p.IPVersion == "4" { return "OSPF" } return "OSPFv3" case protocol.Static: return "Static" case protocol.Kernel: return "Kernel" case protocol.Direct: return "Direct" } return "" } prometheus-bird-exporter-1.2.6+ds/metrics/generic_exporter.go000066400000000000000000000207021415316745700244600ustar00rootroot00000000000000package metrics import ( "github.com/czerwonk/bird_exporter/protocol" "github.com/prometheus/client_golang/prometheus" ) // GenericProtocolMetricExporter exports metrics retrieved from Bird routing daemon type GenericProtocolMetricExporter struct { labelStrategy LabelStrategy prefix string } // NewGenericProtocolMetricExporter creates a new instance of GenericProtocolMetricExporter func NewGenericProtocolMetricExporter(prefix string, newNaming bool, labelStrategy LabelStrategy) *GenericProtocolMetricExporter { m := &GenericProtocolMetricExporter{ prefix: prefix, labelStrategy: labelStrategy, } return m } func (m *GenericProtocolMetricExporter) Describe(ch chan<- *prometheus.Desc) { } func (m *GenericProtocolMetricExporter) Export(p *protocol.Protocol, ch chan<- prometheus.Metric, newNaming bool) { labels := m.labelStrategy.LabelNames(p) var importCountDesc *prometheus.Desc var exportCountDesc *prometheus.Desc var filterCountDesc *prometheus.Desc var preferredCountDesc *prometheus.Desc upDesc := prometheus.NewDesc(m.prefix+"_up", "Protocol is up", labels, nil) if newNaming { importCountDesc = prometheus.NewDesc(m.prefix+"_prefix_import_count", "Number of imported routes", labels, nil) exportCountDesc = prometheus.NewDesc(m.prefix+"_prefix_export_count", "Number of exported routes", labels, nil) filterCountDesc = prometheus.NewDesc(m.prefix+"_prefix_filter_count", "Number of filtered routes", labels, nil) preferredCountDesc = prometheus.NewDesc(m.prefix+"_prefix_preferred_count", "Number of preferred routes", labels, nil) } else { importCountDesc = prometheus.NewDesc(m.prefix+"_prefix_count_import", "Number of imported routes", labels, nil) exportCountDesc = prometheus.NewDesc(m.prefix+"_prefix_count_export", "Number of exported routes", labels, nil) filterCountDesc = prometheus.NewDesc(m.prefix+"_prefix_count_filter", "Number of filtered routes", labels, nil) preferredCountDesc = prometheus.NewDesc(m.prefix+"_prefix_count_preferred", "Number of preferred routes", labels, nil) } uptimeDesc := prometheus.NewDesc(m.prefix+"_uptime", "Uptime of the protocol in seconds", labels, nil) updatesImportIgnoreCountDesc := prometheus.NewDesc(m.prefix+"_changes_update_import_ignore_count", "Number of incoming updates being ignored", labels, nil) updatesImportAcceptCountDesc := prometheus.NewDesc(m.prefix+"_changes_update_import_accept_count", "Number of incoming updates being accepted", labels, nil) updatesImportFilterCountDesc := prometheus.NewDesc(m.prefix+"_changes_update_import_filter_count", "Number of incoming updates being filtered", labels, nil) updatesImportRejectCountDesc := prometheus.NewDesc(m.prefix+"_changes_update_import_reject_count", "Number of incoming updates being rejected", labels, nil) updatesImportReceiveCountDesc := prometheus.NewDesc(m.prefix+"_changes_update_import_receive_count", "Number of received updates", labels, nil) withdrawsImportIgnoreCountDesc := prometheus.NewDesc(m.prefix+"_changes_withdraw_import_ignore_count", "Number of incoming withdraws being ignored", labels, nil) withdrawsImportAcceptCountDesc := prometheus.NewDesc(m.prefix+"_changes_withdraw_import_accept_count", "Number of incoming withdraws being accepted", labels, nil) withdrawsImportFilterCountDesc := prometheus.NewDesc(m.prefix+"_changes_withdraw_import_filter_count", "Number of incoming withdraws being filtered", labels, nil) withdrawsImportRejectCountDesc := prometheus.NewDesc(m.prefix+"_changes_withdraw_import_reject_count", "Number of incoming withdraws being rejected", labels, nil) withdrawsImportReceiveCountDesc := prometheus.NewDesc(m.prefix+"_changes_withdraw_import_receive_count", "Number of received withdraws", labels, nil) updatesExportIgnoreCountDesc := prometheus.NewDesc(m.prefix+"_changes_update_export_ignore_count", "Number of outgoing updates being ignored", labels, nil) updatesExportAcceptCountDesc := prometheus.NewDesc(m.prefix+"_changes_update_export_accept_count", "Number of outgoing updates being accepted", labels, nil) updatesExportFilterCountDesc := prometheus.NewDesc(m.prefix+"_changes_update_export_filter_count", "Number of outgoing updates being filtered", labels, nil) updatesExportRejectCountDesc := prometheus.NewDesc(m.prefix+"_changes_update_export_reject_count", "Number of outgoing updates being rejected", labels, nil) updatesExportReceiveCountDesc := prometheus.NewDesc(m.prefix+"_changes_update_export_receive_count", "Number of sent updates", labels, nil) withdrawsExportIgnoreCountDesc := prometheus.NewDesc(m.prefix+"_changes_withdraw_export_ignore_count", "Number of outgoing withdraws being ignored", labels, nil) withdrawsExportAcceptCountDesc := prometheus.NewDesc(m.prefix+"_changes_withdraw_export_accept_count", "Number of outgoing withdraws being accepted", labels, nil) withdrawsExportFilterCountDesc := prometheus.NewDesc(m.prefix+"_changes_withdraw_export_filter_count", "Number of outgoing withdraws being filtered", labels, nil) withdrawsExportRejectCountDesc := prometheus.NewDesc(m.prefix+"_changes_withdraw_export_reject_count", "Number of outgoing withdraws being rejected", labels, nil) withdrawsExportReceiveCountDesc := prometheus.NewDesc(m.prefix+"_changes_withdraw_export_receive_count", "Number of outgoing withdraws", labels, nil) l := m.labelStrategy.LabelValues(p) ch <- prometheus.MustNewConstMetric(upDesc, prometheus.GaugeValue, float64(p.Up), l...) ch <- prometheus.MustNewConstMetric(importCountDesc, prometheus.GaugeValue, float64(p.Imported), l...) ch <- prometheus.MustNewConstMetric(exportCountDesc, prometheus.GaugeValue, float64(p.Exported), l...) ch <- prometheus.MustNewConstMetric(filterCountDesc, prometheus.GaugeValue, float64(p.Filtered), l...) ch <- prometheus.MustNewConstMetric(preferredCountDesc, prometheus.GaugeValue, float64(p.Preferred), l...) ch <- prometheus.MustNewConstMetric(uptimeDesc, prometheus.GaugeValue, float64(p.Uptime), l...) ch <- prometheus.MustNewConstMetric(updatesImportReceiveCountDesc, prometheus.GaugeValue, float64(p.ImportUpdates.Received), l...) ch <- prometheus.MustNewConstMetric(updatesImportRejectCountDesc, prometheus.GaugeValue, float64(p.ImportUpdates.Rejected), l...) ch <- prometheus.MustNewConstMetric(updatesImportFilterCountDesc, prometheus.GaugeValue, float64(p.ImportUpdates.Filtered), l...) ch <- prometheus.MustNewConstMetric(updatesImportAcceptCountDesc, prometheus.GaugeValue, float64(p.ImportUpdates.Accepted), l...) ch <- prometheus.MustNewConstMetric(updatesImportIgnoreCountDesc, prometheus.GaugeValue, float64(p.ImportUpdates.Ignored), l...) ch <- prometheus.MustNewConstMetric(updatesExportReceiveCountDesc, prometheus.GaugeValue, float64(p.ExportUpdates.Received), l...) ch <- prometheus.MustNewConstMetric(updatesExportRejectCountDesc, prometheus.GaugeValue, float64(p.ExportUpdates.Rejected), l...) ch <- prometheus.MustNewConstMetric(updatesExportFilterCountDesc, prometheus.GaugeValue, float64(p.ExportUpdates.Filtered), l...) ch <- prometheus.MustNewConstMetric(updatesExportAcceptCountDesc, prometheus.GaugeValue, float64(p.ExportUpdates.Accepted), l...) ch <- prometheus.MustNewConstMetric(updatesExportIgnoreCountDesc, prometheus.GaugeValue, float64(p.ExportUpdates.Ignored), l...) ch <- prometheus.MustNewConstMetric(withdrawsImportReceiveCountDesc, prometheus.GaugeValue, float64(p.ImportWithdraws.Received), l...) ch <- prometheus.MustNewConstMetric(withdrawsImportRejectCountDesc, prometheus.GaugeValue, float64(p.ImportWithdraws.Rejected), l...) ch <- prometheus.MustNewConstMetric(withdrawsImportFilterCountDesc, prometheus.GaugeValue, float64(p.ImportWithdraws.Filtered), l...) ch <- prometheus.MustNewConstMetric(withdrawsImportAcceptCountDesc, prometheus.GaugeValue, float64(p.ImportWithdraws.Accepted), l...) ch <- prometheus.MustNewConstMetric(withdrawsImportIgnoreCountDesc, prometheus.GaugeValue, float64(p.ImportWithdraws.Ignored), l...) ch <- prometheus.MustNewConstMetric(withdrawsExportReceiveCountDesc, prometheus.GaugeValue, float64(p.ExportWithdraws.Received), l...) ch <- prometheus.MustNewConstMetric(withdrawsExportRejectCountDesc, prometheus.GaugeValue, float64(p.ExportWithdraws.Rejected), l...) ch <- prometheus.MustNewConstMetric(withdrawsExportFilterCountDesc, prometheus.GaugeValue, float64(p.ExportWithdraws.Filtered), l...) ch <- prometheus.MustNewConstMetric(withdrawsExportAcceptCountDesc, prometheus.GaugeValue, float64(p.ExportWithdraws.Accepted), l...) ch <- prometheus.MustNewConstMetric(withdrawsExportIgnoreCountDesc, prometheus.GaugeValue, float64(p.ExportWithdraws.Ignored), l...) } prometheus-bird-exporter-1.2.6+ds/metrics/label_strategy.go000066400000000000000000000006001415316745700241100ustar00rootroot00000000000000package metrics import "github.com/czerwonk/bird_exporter/protocol" // LabelStrategy abstracts the label generation for protocol metrics type LabelStrategy interface { // LabelNames is the list of label names LabelNames(p *protocol.Protocol) []string // Label values is the list of values for the labels specified in `LabelNames()` LabelValues(p *protocol.Protocol) []string } prometheus-bird-exporter-1.2.6+ds/metrics/legacy_exporter.go000066400000000000000000000016261415316745700243140ustar00rootroot00000000000000package metrics import ( "github.com/czerwonk/bird_exporter/protocol" "github.com/prometheus/client_golang/prometheus" ) type LegacyMetricExporter struct { ipv4Exporter *GenericProtocolMetricExporter ipv6Exporter *GenericProtocolMetricExporter } func NewLegacyMetricExporter(prefixIpv4, prefixIpv6 string, labelStrategy LabelStrategy) MetricExporter { return &LegacyMetricExporter{ ipv4Exporter: NewGenericProtocolMetricExporter(prefixIpv4, false, labelStrategy), ipv6Exporter: NewGenericProtocolMetricExporter(prefixIpv6, false, labelStrategy), } } func (e *LegacyMetricExporter) Describe(ch chan<- *prometheus.Desc) { e.ipv4Exporter.Describe(ch) e.ipv6Exporter.Describe(ch) } func (e *LegacyMetricExporter) Export(p *protocol.Protocol, ch chan<- prometheus.Metric, newFormat bool) { if p.IPVersion == "4" { e.ipv4Exporter.Export(p, ch, false) } else { e.ipv6Exporter.Export(p, ch, false) } } prometheus-bird-exporter-1.2.6+ds/metrics/legacy_label_strategy.go000066400000000000000000000006121415316745700254370ustar00rootroot00000000000000package metrics import "github.com/czerwonk/bird_exporter/protocol" type LegacyLabelStrategy struct { } func NewLegacyLabelStrategy() *LegacyLabelStrategy { return &LegacyLabelStrategy{} } func (*LegacyLabelStrategy) LabelNames(p *protocol.Protocol) []string { return []string{"name"} } func (*LegacyLabelStrategy) LabelValues(p *protocol.Protocol) []string { return []string{p.Name} } prometheus-bird-exporter-1.2.6+ds/metrics/metrics_exporter.go000066400000000000000000000004201415316745700245050ustar00rootroot00000000000000package metrics import ( "github.com/czerwonk/bird_exporter/protocol" "github.com/prometheus/client_golang/prometheus" ) type MetricExporter interface { Describe(ch chan<- *prometheus.Desc) Export(p *protocol.Protocol, ch chan<- prometheus.Metric, newFormat bool) } prometheus-bird-exporter-1.2.6+ds/metrics/ospf_exporter.go000066400000000000000000000050371415316745700240170ustar00rootroot00000000000000package metrics import ( "github.com/czerwonk/bird_exporter/client" "github.com/czerwonk/bird_exporter/protocol" "github.com/prometheus/client_golang/prometheus" log "github.com/sirupsen/logrus" ) type ospfDesc struct { runningDesc *prometheus.Desc interfaceCountDesc *prometheus.Desc neighborCountDesc *prometheus.Desc neighborAdjacentCountDesc *prometheus.Desc } type ospfMetricExporter struct { descriptions map[string]*ospfDesc client client.Client } // NewOSPFExporter creates a new MetricExporter for OSPF metrics func NewOSPFExporter(prefix string, client client.Client) MetricExporter { d := make(map[string]*ospfDesc) d["4"] = getDesc(prefix + "ospf") d["6"] = getDesc(prefix + "ospfv3") return &ospfMetricExporter{descriptions: d, client: client} } func getDesc(prefix string) *ospfDesc { labels := []string{"name"} d := &ospfDesc{} d.runningDesc = prometheus.NewDesc(prefix+"_running", "State of OSPF: 0 = Alone, 1 = Running (Neighbor-Adjacencies established)", labels, nil) labels = append(labels, "area") d.interfaceCountDesc = prometheus.NewDesc(prefix+"_interface_count", "Number of interfaces in the area", labels, nil) d.neighborCountDesc = prometheus.NewDesc(prefix+"_neighbor_count", "Number of neighbors in the area", labels, nil) d.neighborAdjacentCountDesc = prometheus.NewDesc(prefix+"_neighbor_adjacent_count", "Number of adjacent neighbors in the area", labels, nil) return d } func (m *ospfMetricExporter) Describe(ch chan<- *prometheus.Desc) { m.describe("4", ch) m.describe("6", ch) } func (m *ospfMetricExporter) describe(ipVersion string, ch chan<- *prometheus.Desc) { d := m.descriptions[ipVersion] ch <- d.runningDesc ch <- d.interfaceCountDesc ch <- d.neighborCountDesc ch <- d.neighborAdjacentCountDesc } func (m *ospfMetricExporter) Export(p *protocol.Protocol, ch chan<- prometheus.Metric, newFormat bool) { d := m.descriptions[p.IPVersion] ch <- prometheus.MustNewConstMetric(d.runningDesc, prometheus.GaugeValue, p.Attributes["running"], p.Name) areas, err := m.client.GetOSPFAreas(p) if err != nil { log.Errorln(err) return } for _, area := range areas { l := []string{p.Name, area.Name} ch <- prometheus.MustNewConstMetric(d.interfaceCountDesc, prometheus.GaugeValue, float64(area.InterfaceCount), l...) ch <- prometheus.MustNewConstMetric(d.neighborCountDesc, prometheus.GaugeValue, float64(area.NeighborCount), l...) ch <- prometheus.MustNewConstMetric(d.neighborAdjacentCountDesc, prometheus.GaugeValue, float64(area.NeighborAdjacentCount), l...) } } prometheus-bird-exporter-1.2.6+ds/parser/000077500000000000000000000000001415316745700204125ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/parser/ospf.go000066400000000000000000000026241415316745700217140ustar00rootroot00000000000000package parser import ( "regexp" "bufio" "bytes" "strings" "github.com/czerwonk/bird_exporter/protocol" ) type ospfRegex struct { area *regexp.Regexp counters *regexp.Regexp } type ospfContext struct { line string areas []*protocol.OspfArea current *protocol.OspfArea } func init() { ospf = &ospfRegex{ area: regexp.MustCompile("Area: [^\\s]+ \\(([^\\s]+)\\)"), counters: regexp.MustCompile("Number of ([^:]+):\\s*(\\d+)"), } } var ospf *ospfRegex func ParseOspf(data []byte) []*protocol.OspfArea { reader := bytes.NewReader(data) scanner := bufio.NewScanner(reader) c := &ospfContext{ areas: make([]*protocol.OspfArea, 0), } for scanner.Scan() { c.line = strings.Trim(scanner.Text(), " ") parseLineForOspfArea(c) parseLineForOspfCounters(c) } return c.areas } func parseLineForOspfArea(c *ospfContext) { m := ospf.area.FindStringSubmatch(c.line) if m == nil { return } a := &protocol.OspfArea{Name: m[1]} c.current = a c.areas = append(c.areas, a) } func parseLineForOspfCounters(c *ospfContext) { if c.current == nil { return } m := ospf.counters.FindStringSubmatch(c.line) if m == nil { return } name := m[1] value := parseInt(m[2]) if name == "interfaces" { c.current.InterfaceCount = value } if name == "neighbors" { c.current.NeighborCount = value } if name == "adjacent neighbors" { c.current.NeighborAdjacentCount = value } } prometheus-bird-exporter-1.2.6+ds/parser/parser.go000066400000000000000000000147571415316745700222530ustar00rootroot00000000000000package parser import ( "bufio" "bytes" "fmt" "regexp" "strconv" "strings" "time" "github.com/czerwonk/bird_exporter/protocol" log "github.com/sirupsen/logrus" ) var ( protocolRegex *regexp.Regexp descriptionRegex *regexp.Regexp routeRegex *regexp.Regexp uptimeRegex *regexp.Regexp routeChangeRegex *regexp.Regexp filterRegex *regexp.Regexp channelRegex *regexp.Regexp ) type context struct { current *protocol.Protocol line string handled bool protocols []*protocol.Protocol ipVersion string } func init() { protocolRegex = regexp.MustCompile(`^(?:1002\-)?([^\s]+)\s+(MRT|BGP|BFD|OSPF|RPKI|RIP|RAdv|Pipe|Perf|Direct|Babel|Device|Kernel|Static)\s+([^\s]+)\s+([^\s]+)\s+(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|[^\s]+)(?:\s+(.*?))?$`) descriptionRegex = regexp.MustCompile(`Description:\s+(.*)`) routeRegex = regexp.MustCompile(`^\s+Routes:\s+(\d+) imported, (?:(\d+) filtered, )?(\d+) exported(?:, (\d+) preferred)?`) uptimeRegex = regexp.MustCompile(`^(?:((\d+):(\d{2}):(\d{2}))|(\d+)|(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}))$`) routeChangeRegex = regexp.MustCompile(`(Import|Export) (updates|withdraws):\s+(\d+|---)\s+(\d+|---)\s+(\d+|---)\s+(\d+|---)\s+(\d+|---)\s*`) filterRegex = regexp.MustCompile(`(Input|Output) filter:\s+(.*)`) channelRegex = regexp.MustCompile(`Channel ipv(4|6)`) } // ParseProtocols parses bird output and returns protocol.Protocol structs func ParseProtocols(data []byte, ipVersion string) []*protocol.Protocol { reader := bytes.NewReader(data) scanner := bufio.NewScanner(reader) c := &context{protocols: make([]*protocol.Protocol, 0), ipVersion: ipVersion} var handlers = []func(*context){ handleEmptyLine, parseLineForProtocol, parseLineForDescription, parseLineForChannel, parseLineForRoutes, parseLineForRouteChanges, parseLineForFilterName, } for scanner.Scan() { c.line = strings.TrimRight(scanner.Text(), " ") c.handled = false for _, h := range handlers { if !c.handled { h(c) } } } return c.protocols } func handleEmptyLine(c *context) { if c.line != "" { return } c.current = nil c.handled = true } func parseLineForProtocol(c *context) { match := protocolRegex.FindStringSubmatch(c.line) if match == nil { return } proto := parseProto(match[2]) ut := parseUptime(match[5]) c.current = protocol.NewProtocol(match[1], proto, c.ipVersion, ut) c.current.Up = parseState(match[4]) fillAttributes(c.current, match) c.protocols = append(c.protocols, c.current) c.handled = true } func parseLineForDescription(c *context) { match := descriptionRegex.FindStringSubmatch(c.line) if match == nil { return } if len(match) <= 1 { return } c.current.Description = strings.Join(match[1:], " ") } func parseProto(val string) int { switch val { case "BGP": return protocol.BGP case "OSPF": return protocol.OSPF case "Direct": return protocol.Direct case "Kernel": return protocol.Kernel case "Static": return protocol.Static } return protocol.PROTO_UNKNOWN } func parseState(state string) int { if state == "up" { return 1 } return 0 } func parseUptime(value string) int { match := uptimeRegex.FindStringSubmatch(value) if match == nil { return 0 } if len(match[1]) > 0 { return parseUptimeForDuration(match) } if len(match[5]) > 0 { return parseUptimeForTimestamp(value) } return parseUptimeForIso(value) } func parseUptimeForIso(s string) int { start, err := time.ParseInLocation("2006-01-02 15:04:05", s, time.Local) if err != nil { log.Errorln(err) return 0 } return int(time.Since(start).Seconds()) } func parseUptimeForDuration(duration []string) int { h := parseInt(duration[2]) m := parseInt(duration[3]) s := parseInt(duration[4]) str := fmt.Sprintf("%dh%dm%ds", h, m, s) d, err := time.ParseDuration(str) if err != nil { log.Errorln(err) return 0 } return int(d.Seconds()) } func parseUptimeForTimestamp(timestamp string) int { since := parseInt(timestamp) s := time.Unix(since, 0) d := time.Since(s) return int(d.Seconds()) } func parseLineForChannel(c *context) { if c.ipVersion != "" || c.current == nil { return } channel := channelRegex.FindStringSubmatch(c.line) if channel == nil { return } if len(c.current.IPVersion) == 0 { c.current.IPVersion = channel[1] } else { c.current = &protocol.Protocol{ Name: c.current.Name, Proto: c.current.Proto, Up: c.current.Up, Uptime: c.current.Uptime, IPVersion: channel[1], } c.protocols = append(c.protocols, c.current) } c.handled = true } func parseLineForRoutes(c *context) { if c.current == nil { return } match := routeRegex.FindStringSubmatch(c.line) if match == nil { return } c.current.Imported, _ = strconv.ParseInt(match[1], 10, 64) c.current.Exported, _ = strconv.ParseInt(match[3], 10, 64) if len(match[2]) > 0 { c.current.Filtered, _ = strconv.ParseInt(match[2], 10, 64) } if len(match[4]) > 0 { c.current.Preferred, _ = strconv.ParseInt(match[4], 10, 64) } c.handled = true } func parseLineForRouteChanges(c *context) { if c.current == nil { return } match := routeChangeRegex.FindStringSubmatch(c.line) if match == nil { return } x := getRouteChangeCount(match, c.current) x.Received = parseRouteChangeValue(match[3]) x.Rejected = parseRouteChangeValue(match[4]) x.Filtered = parseRouteChangeValue(match[5]) x.Ignored = parseRouteChangeValue(match[6]) x.Accepted = parseRouteChangeValue(match[7]) c.handled = true } func getRouteChangeCount(values []string, p *protocol.Protocol) *protocol.RouteChangeCount { if values[1] == "Import" { if values[2] == "updates" { return &p.ImportUpdates } return &p.ImportWithdraws } if values[2] == "updates" { return &p.ExportUpdates } return &p.ExportWithdraws } func parseRouteChangeValue(value string) int64 { if value == "---" { return 0 } return parseInt(value) } func parseLineForFilterName(c *context) { if c.current == nil { return } match := filterRegex.FindStringSubmatch(c.line) if match == nil { return } if match[1] == "Input" { c.current.ImportFilter = match[2] } else { c.current.ExportFilter = match[2] } c.handled = true } func parseInt(value string) int64 { i, err := strconv.ParseInt(value, 10, 64) if err != nil { log.Errorln(err) return 0 } return i } func fillAttributes(p *protocol.Protocol, m []string) { if p.Proto == protocol.OSPF { p.Attributes["running"] = float64(parseOspfRunning(m[6])) } } func parseOspfRunning(state string) int { if state == "Running" { return 1 } return 0 } prometheus-bird-exporter-1.2.6+ds/parser/parser_test.go000066400000000000000000000426571415316745700233120ustar00rootroot00000000000000package parser import ( "testing" "time" "github.com/czerwonk/bird_exporter/protocol" "github.com/czerwonk/testutils/assert" ) func TestEstablishedBgpOldTimeFormat(t *testing.T) { data := "foo BGP master up 1514768400 Established\ntest\nbar\n Routes: 12 imported, 1 filtered, 34 exported, 100 preferred\nxxx" s := time.Date(2018, time.January, 1, 1, 0, 0, 0, time.UTC) min := int(time.Since(s).Seconds()) p := ParseProtocols([]byte(data), "4") max := int(time.Since(s).Seconds()) x := p[0] assert.StringEqual("name", "foo", x.Name, t) assert.IntEqual("proto", protocol.BGP, x.Proto, t) assert.IntEqual("established", 1, x.Up, t) assert.Int64Equal("imported", 12, x.Imported, t) assert.Int64Equal("exported", 34, x.Exported, t) assert.Int64Equal("filtered", 1, x.Filtered, t) assert.Int64Equal("preferred", 100, x.Preferred, t) assert.StringEqual("ipVersion", "4", x.IPVersion, t) assert.That("uptime", "uptime is feasable", func() bool { return x.Uptime >= min && max <= x.Uptime }, t) } func TestEstablishedBgpCurrentTimeFormat(t *testing.T) { data := "foo BGP master up 00:01:00 Established\ntest\nbar\n Routes: 12 imported, 1 filtered, 34 exported, 100 preferred\nxxx" p := ParseProtocols([]byte(data), "4") assert.IntEqual("protocols", 1, len(p), t) x := p[0] assert.StringEqual("name", "foo", x.Name, t) assert.IntEqual("proto", protocol.BGP, x.Proto, t) assert.IntEqual("established", 1, x.Up, t) assert.Int64Equal("imported", 12, x.Imported, t) assert.Int64Equal("exported", 34, x.Exported, t) assert.Int64Equal("filtered", 1, x.Filtered, t) assert.Int64Equal("preferred", 100, x.Preferred, t) assert.StringEqual("ipVersion", "4", x.IPVersion, t) assert.IntEqual("uptime", 60, x.Uptime, t) } func TestEstablishedBgpIsoLongTimeFormat(t *testing.T) { data := "foo BGP master up 2018-01-01 01:00:00 Established\ntest\nbar\n Routes: 12 imported, 1 filtered, 34 exported, 100 preferred\nxxx" s := time.Date(2018, time.January, 1, 1, 0, 0, 0, time.UTC) min := int(time.Since(s).Seconds()) p := ParseProtocols([]byte(data), "4") max := int(time.Since(s).Seconds()) assert.IntEqual("protocols", 1, len(p), t) x := p[0] assert.StringEqual("name", "foo", x.Name, t) assert.IntEqual("proto", protocol.BGP, x.Proto, t) assert.IntEqual("established", 1, x.Up, t) assert.Int64Equal("imported", 12, x.Imported, t) assert.Int64Equal("exported", 34, x.Exported, t) assert.Int64Equal("filtered", 1, x.Filtered, t) assert.Int64Equal("preferred", 100, x.Preferred, t) assert.StringEqual("ipVersion", "4", x.IPVersion, t) assert.That("uptime", "uptime is feasable", func() bool { return x.Uptime >= min && max <= x.Uptime }, t) } func TestIpv6Bgp(t *testing.T) { data := "foo BGP master up 00:01:00 Established\ntest\nbar\n Routes: 12 imported, 1 filtered, 34 exported, 100 preferred\nxxx" p := ParseProtocols([]byte(data), "6") assert.IntEqual("protocols", 1, len(p), t) x := p[0] assert.StringEqual("ipVersion", "6", x.IPVersion, t) } func TestActiveBgp(t *testing.T) { data := "bar BGP master start 2016-01-01 Active\ntest\nbar" p := ParseProtocols([]byte(data), "4") assert.IntEqual("protocols", 1, len(p), t) x := p[0] assert.StringEqual("name", "bar", x.Name, t) assert.IntEqual("proto", protocol.BGP, x.Proto, t) assert.IntEqual("established", 0, x.Up, t) assert.IntEqual("imported", 0, int(x.Imported), t) assert.IntEqual("exported", 0, int(x.Exported), t) assert.StringEqual("ipVersion", "4", x.IPVersion, t) assert.IntEqual("uptime", 0, int(x.Uptime), t) } func Test2BgpSessions(t *testing.T) { data := "foo BGP master up 00:01:00 Established\ntest\n Routes: 12 imported, 1 filtered, 34 exported, 100 preferred\nbar BGP master start 2016-01-01 Active\nxxx" p := ParseProtocols([]byte(data), "4") assert.IntEqual("protocols", 2, len(p), t) } func TestUpdateAndWithdrawCounts(t *testing.T) { data := "foo BGP master up 00:01:00 Established\ntest\n" + " Routes: 12 imported, 1 filtered, 34 exported, 100 preferred\n" + " Route change stats: received rejected filtered ignored accepted\n" + " Import updates: 1 2 3 4 5\n" + " Import withdraws: 6 7 8 9 10\n" + " Export updates: 11 12 13 14 15\n" + " Export withdraws: 16 17 18 19 ---" p := ParseProtocols([]byte(data), "4") x := p[0] assert.Int64Equal("import updates received", 1, x.ImportUpdates.Received, t) assert.Int64Equal("import updates rejected", 2, x.ImportUpdates.Rejected, t) assert.Int64Equal("import updates filtered", 3, x.ImportUpdates.Filtered, t) assert.Int64Equal("import updates ignored", 4, x.ImportUpdates.Ignored, t) assert.Int64Equal("import updates accepted", 5, x.ImportUpdates.Accepted, t) assert.Int64Equal("import withdraws received", 6, x.ImportWithdraws.Received, t) assert.Int64Equal("import withdraws rejected", 7, x.ImportWithdraws.Rejected, t) assert.Int64Equal("import withdraws filtered", 8, x.ImportWithdraws.Filtered, t) assert.Int64Equal("import withdraws ignored", 9, x.ImportWithdraws.Ignored, t) assert.Int64Equal("import withdraws accepted", 10, x.ImportWithdraws.Accepted, t) assert.Int64Equal("export updates received", 11, x.ExportUpdates.Received, t) assert.Int64Equal("export updates rejected", 12, x.ExportUpdates.Rejected, t) assert.Int64Equal("export updates filtered", 13, x.ExportUpdates.Filtered, t) assert.Int64Equal("export updates ignored", 14, x.ExportUpdates.Ignored, t) assert.Int64Equal("export updates accepted", 15, x.ExportUpdates.Accepted, t) assert.Int64Equal("export withdraws received", 16, x.ExportWithdraws.Received, t) assert.Int64Equal("export withdraws rejected", 17, x.ExportWithdraws.Rejected, t) assert.Int64Equal("export withdraws filtered", 18, x.ExportWithdraws.Filtered, t) assert.Int64Equal("export withdraws ignored", 19, x.ExportWithdraws.Ignored, t) assert.Int64Equal("export withdraws accepted", 0, x.ExportWithdraws.Accepted, t) } func TestWithBird2(t *testing.T) { data := "Name Proto Table State Since Info\n" + "bgp1 BGP master up 1494926415\n" + " Channel ipv6\n" + " Routes: 1 imported, 2 filtered, 3 exported, 4 preferred\n" + " Input filter: none\n" + " Output filter: all\n" + "\n" + "direct1 Direct --- up 1513027903\n" + " Channel ipv4\n" + " State: UP\n" + " Table: master4\n" + " Preference: 240\n" + " Input filter: ACCEPT\n" + " Output filter: REJECT\n" + " Routes: 12 imported, 1 filtered, 34 exported, 100 preferred\n" + " Route change stats: received rejected filtered ignored accepted\n" + " Import updates: 1 2 3 4 5\n" + " Import withdraws: 6 7 8 9 10\n" + " Export updates: 11 12 13 14 15\n" + " Export withdraws: 16 17 18 19 ---\n" + " Channel ipv6\n" + " State: UP\n" + " Table: master6\n" + " Preference: 240\n" + " Input filter: ACCEPT\n" + " Output filter: REJECT\n" + " Routes: 3 imported, 7 filtered, 5 exported, 13 preferred\n" + " Route change stats: received rejected filtered ignored accepted\n" + " Import updates: 20 21 22 23 24\n" + " Import withdraws: 25 26 27 28 29\n" + " Export updates: 30 31 32 33 34\n" + " Export withdraws: 35 36 37 38 ---\n" + "\n" + "ospf1 OSPF master up 1494926415\n" + " Channel ipv4\n" + " Routes: 4 imported, 3 filtered, 2 exported, 1 preferred\n" + "\n" p := ParseProtocols([]byte(data), "") assert.IntEqual("protocols", 4, len(p), t) x := p[0] assert.StringEqual("BGP ipv6 name", "bgp1", x.Name, t) assert.IntEqual("BGP ipv6 proto", protocol.BGP, x.Proto, t) assert.StringEqual("BGP ipv6 ip version", "6", x.IPVersion, t) assert.Int64Equal("BGP ipv6 imported", 1, x.Imported, t) assert.Int64Equal("BGP ipv6 exported", 3, x.Exported, t) assert.Int64Equal("BGP ipv6 filtered", 2, x.Filtered, t) assert.Int64Equal("BGP ipv6 preferred", 4, x.Preferred, t) assert.StringEqual("BGP import filter", "none", x.ImportFilter, t) assert.StringEqual("BGP export filter", "all", x.ExportFilter, t) x = p[1] assert.StringEqual("Direct ipv4 name", "direct1", x.Name, t) assert.IntEqual("Direct ipv4 proto", protocol.Direct, x.Proto, t) assert.StringEqual("Direct ipv4 ip version", "4", x.IPVersion, t) assert.Int64Equal("Direct ipv4 imported", 12, x.Imported, t) assert.Int64Equal("Direct ipv4 exported", 34, x.Exported, t) assert.Int64Equal("Direct ipv4 filtered", 1, x.Filtered, t) assert.Int64Equal("Direct ipv4 preferred", 100, x.Preferred, t) assert.Int64Equal("Direct ipv4 import updates received", 1, x.ImportUpdates.Received, t) assert.Int64Equal("Direct ipv4 import updates rejected", 2, x.ImportUpdates.Rejected, t) assert.Int64Equal("Direct ipv4 import updates filtered", 3, x.ImportUpdates.Filtered, t) assert.Int64Equal("Direct ipv4 import updates ignored", 4, x.ImportUpdates.Ignored, t) assert.Int64Equal("Direct ipv4 import updates accepted", 5, x.ImportUpdates.Accepted, t) assert.Int64Equal("Direct ipv4 import withdraws received", 6, x.ImportWithdraws.Received, t) assert.Int64Equal("Direct ipv4 import withdraws rejected", 7, x.ImportWithdraws.Rejected, t) assert.Int64Equal("Direct ipv4 import withdraws filtered", 8, x.ImportWithdraws.Filtered, t) assert.Int64Equal("Direct ipv4 import withdraws ignored", 9, x.ImportWithdraws.Ignored, t) assert.Int64Equal("Direct ipv4 import withdraws accepted", 10, x.ImportWithdraws.Accepted, t) assert.Int64Equal("Direct ipv4 export updates received", 11, x.ExportUpdates.Received, t) assert.Int64Equal("Direct ipv4 export updates rejected", 12, x.ExportUpdates.Rejected, t) assert.Int64Equal("Direct ipv4 export updates filtered", 13, x.ExportUpdates.Filtered, t) assert.Int64Equal("Direct ipv4 export updates ignored", 14, x.ExportUpdates.Ignored, t) assert.Int64Equal("Direct ipv4 export updates accepted", 15, x.ExportUpdates.Accepted, t) assert.Int64Equal("Direct ipv4 export withdraws received", 16, x.ExportWithdraws.Received, t) assert.Int64Equal("Direct ipv4 export withdraws rejected", 17, x.ExportWithdraws.Rejected, t) assert.Int64Equal("Direct ipv4 export withdraws filtered", 18, x.ExportWithdraws.Filtered, t) assert.Int64Equal("Direct ipv4 export withdraws ignored", 19, x.ExportWithdraws.Ignored, t) assert.Int64Equal("Direct ipv4 export withdraws accepted", 0, x.ExportWithdraws.Accepted, t) x = p[2] assert.StringEqual("Direct ipv6 name", "direct1", x.Name, t) assert.IntEqual("Direct ipv6 proto", protocol.Direct, x.Proto, t) assert.StringEqual("Direct ipv6 ip version", "6", x.IPVersion, t) assert.Int64Equal("Direct ipv6 imported", 3, x.Imported, t) assert.Int64Equal("Direct ipv6 exported", 5, x.Exported, t) assert.Int64Equal("Direct ipv6 filtered", 7, x.Filtered, t) assert.Int64Equal("Direct ipv6 preferred", 13, x.Preferred, t) assert.Int64Equal("Direct ipv6 import updates received", 20, x.ImportUpdates.Received, t) assert.Int64Equal("Direct ipv6 import updates rejected", 21, x.ImportUpdates.Rejected, t) assert.Int64Equal("Direct ipv6 import updates filtered", 22, x.ImportUpdates.Filtered, t) assert.Int64Equal("Direct ipv6 import updates ignored", 23, x.ImportUpdates.Ignored, t) assert.Int64Equal("Direct ipv6 import updates accepted", 24, x.ImportUpdates.Accepted, t) assert.Int64Equal("Direct ipv6 import withdraws received", 25, x.ImportWithdraws.Received, t) assert.Int64Equal("Direct ipv6 import withdraws rejected", 26, x.ImportWithdraws.Rejected, t) assert.Int64Equal("Direct ipv6 import withdraws filtered", 27, x.ImportWithdraws.Filtered, t) assert.Int64Equal("Direct ipv6 import withdraws ignored", 28, x.ImportWithdraws.Ignored, t) assert.Int64Equal("Direct ipv6 import withdraws accepted", 29, x.ImportWithdraws.Accepted, t) assert.Int64Equal("Direct ipv6 export updates received", 30, x.ExportUpdates.Received, t) assert.Int64Equal("Direct ipv6 export updates rejected", 31, x.ExportUpdates.Rejected, t) assert.Int64Equal("Direct ipv6 export updates filtered", 32, x.ExportUpdates.Filtered, t) assert.Int64Equal("Direct ipv6 export updates ignored", 33, x.ExportUpdates.Ignored, t) assert.Int64Equal("Direct ipv6 export updates accepted", 34, x.ExportUpdates.Accepted, t) assert.Int64Equal("Direct ipv6 export withdraws received", 35, x.ExportWithdraws.Received, t) assert.Int64Equal("Direct ipv6 export withdraws rejected", 36, x.ExportWithdraws.Rejected, t) assert.Int64Equal("Direct ipv6 export withdraws filtered", 37, x.ExportWithdraws.Filtered, t) assert.Int64Equal("Direct ipv6 export withdraws ignored", 38, x.ExportWithdraws.Ignored, t) assert.Int64Equal("Direct ipv6 export withdraws accepted", 0, x.ExportWithdraws.Accepted, t) x = p[3] assert.StringEqual("OSPF ipv4 name", "ospf1", x.Name, t) assert.IntEqual("OSPF ipv4 proto", protocol.OSPF, x.Proto, t) assert.StringEqual("OSPF ipv4 ip version", "4", x.IPVersion, t) assert.Int64Equal("OSPF ipv4 imported", 4, x.Imported, t) assert.Int64Equal("OSPF ipv4 exported", 2, x.Exported, t) assert.Int64Equal("OSPF ipv4 filtered", 3, x.Filtered, t) assert.Int64Equal("OSPF ipv4 preferred", 1, x.Preferred, t) } func TestOspfOldTimeFormat(t *testing.T) { data := "ospf1 OSPF master up 1481973060 Running\ntest\nbar\n Routes: 12 imported, 34 exported, 100 preferred\nxxx" p := ParseProtocols([]byte(data), "4") assert.IntEqual("protocols", 1, len(p), t) x := p[0] assert.StringEqual("name", "ospf1", x.Name, t) assert.IntEqual("proto", protocol.OSPF, x.Proto, t) assert.IntEqual("up", 1, x.Up, t) assert.Int64Equal("imported", 12, x.Imported, t) assert.Int64Equal("exported", 34, x.Exported, t) assert.Int64Equal("preferred", 100, x.Preferred, t) assert.StringEqual("ipVersion", "4", x.IPVersion, t) } func TestOspfCurrentTimeFormat(t *testing.T) { data := "ospf1 OSPF master up 00:01:00 Running\ntest\nbar\n Routes: 12 imported, 34 exported, 100 preferred\nxxx" p := ParseProtocols([]byte(data), "4") assert.IntEqual("protocols", 1, len(p), t) x := p[0] assert.StringEqual("name", "ospf1", x.Name, t) assert.IntEqual("proto", protocol.OSPF, x.Proto, t) assert.IntEqual("up", 1, x.Up, t) assert.Int64Equal("imported", 12, x.Imported, t) assert.Int64Equal("exported", 34, x.Exported, t) assert.Int64Equal("preferred", 100, x.Preferred, t) assert.StringEqual("ipVersion", "4", x.IPVersion, t) assert.IntEqual("uptime", 60, x.Uptime, t) } func TestOspfProtocolDown(t *testing.T) { data := "o_hrz OSPF t_hrz down 1494926415 \n Preference: 150\n Input filter: ACCEPT\n Output filter: REJECT\nxxx" p := ParseProtocols([]byte(data), "6") assert.IntEqual("protocols", 1, len(p), t) x := p[0] assert.StringEqual("name", "o_hrz", x.Name, t) assert.IntEqual("proto", protocol.OSPF, x.Proto, t) assert.IntEqual("up", 0, x.Up, t) assert.Int64Equal("imported", 0, x.Imported, t) assert.Int64Equal("exported", 0, x.Exported, t) assert.StringEqual("ipVersion", "6", x.IPVersion, t) } func TestOspfRunning(t *testing.T) { data := "ospf1 OSPF master up 00:01:00 Running\ntest\nbar\n Routes: 12 imported, 34 exported, 100 preferred\nxxx" p := ParseProtocols([]byte(data), "4") assert.IntEqual("protocols", 1, len(p), t) x := p[0] assert.Float64Equal("running", 1, x.Attributes["running"], t) } func TestOspfAlone(t *testing.T) { data := "ospf1 OSPF master up 00:01:00 Alone\ntest\nbar\n Routes: 12 imported, 34 exported, 100 preferred\nxxx" p := ParseProtocols([]byte(data), "4") assert.IntEqual("protocols", 1, len(p), t) x := p[0] assert.Float64Equal("running", 0, x.Attributes["running"], t) } func TestOspfArea(t *testing.T) { data := "ospf1:\n" + "RFC1583 compatibility: disabled\n" + "Stub router: No\n" + "RT scheduler tick: 1\n" + "Number of areas: 2\n" + "Number of LSAs in DB: 33\n" + " Area: 0.0.0.0 (0) [BACKBONE]\n" + " Stub: No\n" + " NSSA: No\n" + " Transit: No\n" + " Number of interfaces: 3\n" + " Number of neighbors: 2\n" + " Number of adjacent neighbors: 1\n" + " Area: 0.0.0.1 (1)\n" + " Stub: No\n" + " NSSA: No\n" + " Transit: No\n" + " Number of interfaces: 4\n" + " Number of neighbors: 6\n" + " Number of adjacent neighbors: 5\n" a := ParseOspf([]byte(data)) assert.IntEqual("areas", 2, len(a), t) a1 := a[0] assert.StringEqual("Area1 Name", "0", a1.Name, t) assert.Int64Equal("Area1 InterfaceCount", 3, a1.InterfaceCount, t) assert.Int64Equal("Area1 NeighborCount", 2, a1.NeighborCount, t) assert.Int64Equal("Area1 NeighborAdjacentCount", 1, a1.NeighborAdjacentCount, t) a2 := a[1] assert.StringEqual("Area2 Name", "1", a2.Name, t) assert.Int64Equal("Area2 InterfaceCount", 4, a2.InterfaceCount, t) assert.Int64Equal("Area2 NeighborCount", 6, a2.NeighborCount, t) assert.Int64Equal("Area2 NeighborAdjacentCount", 5, a2.NeighborAdjacentCount, t) } prometheus-bird-exporter-1.2.6+ds/protocol/000077500000000000000000000000001415316745700207575ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/protocol/ospf_area.go000066400000000000000000000002401415316745700232410ustar00rootroot00000000000000package protocol type OspfArea struct { Name string InterfaceCount int64 NeighborCount int64 NeighborAdjacentCount int64 } prometheus-bird-exporter-1.2.6+ds/protocol/protocol.go000066400000000000000000000016501415316745700231510ustar00rootroot00000000000000package protocol const ( PROTO_UNKNOWN = 0 BGP = 1 OSPF = 2 Kernel = 4 Static = 8 Direct = 16 ) type Protocol struct { Name string Description string IPVersion string ImportFilter string ExportFilter string Proto int Up int Imported int64 Exported int64 Filtered int64 Preferred int64 Uptime int Attributes map[string]float64 ImportUpdates RouteChangeCount ImportWithdraws RouteChangeCount ExportUpdates RouteChangeCount ExportWithdraws RouteChangeCount } type RouteChangeCount struct { Received int64 Rejected int64 Filtered int64 Ignored int64 Accepted int64 } func NewProtocol(name string, proto int, ipVersion string, uptime int) *Protocol { return &Protocol{Name: name, Proto: proto, IPVersion: ipVersion, Uptime: uptime, Attributes: make(map[string]float64)} } prometheus-bird-exporter-1.2.6+ds/vendor/000077500000000000000000000000001415316745700204135ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/vendor/github.com/000077500000000000000000000000001415316745700224525ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/000077500000000000000000000000001415316745700243145ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/bird_socket/000077500000000000000000000000001415316745700266045ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/bird_socket/.gitignore000066400000000000000000000004401415316745700305720ustar00rootroot00000000000000# Binaries for programs and plugins *.exe *.dll *.so *.dylib # Test binary, build with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out # Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 .glide/ .idea *.iml prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/bird_socket/.travis.yml000066400000000000000000000000151415316745700307110ustar00rootroot00000000000000language: go prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/bird_socket/LICENSE000066400000000000000000000020601415316745700276070ustar00rootroot00000000000000MIT License Copyright (c) 2017 Daniel Czerwonk Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/bird_socket/README.md000066400000000000000000000013341415316745700300640ustar00rootroot00000000000000# bird_socket [![GoDoc](https://godoc.org/github.com/czerwonk/bird_socket?status.svg)](https://godoc.org/github.com/czerwonk/bird_socket) [![Build Status](https://travis-ci.org/czerwonk/bird_socket.svg)](https://travis-ci.org/czerwonk/bird_socket) [![Go Report Card](https://goreportcard.com/badge/github.com/czerwonk/bird_socket)](https://goreportcard.com/report/github.com/czerwonk/bird_socket) [![Sourcegraph](https://sourcegraph.com/github.com/czerwonk/bird_socket/-/badge.svg)](https://sourcegraph.com/github.com/czerwonk/bird_socket?badge) Golang library to communicate with Bird routing daemon ## License (c) Daniel Czerwonk, 2017. Licensed under [MIT](LICENSE) license. ## Bird routing daemon see http://bird.network.cz/ prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/bird_socket/bird_socket.go000066400000000000000000000036351415316745700314320ustar00rootroot00000000000000package birdsocket import ( "net" "regexp" "strings" ) var birdReturnCodeRegex *regexp.Regexp func init() { birdReturnCodeRegex = regexp.MustCompile("\\d{4} \n$") } // BirdSocket encapsulates communication with Bird routing daemon type BirdSocket struct { SocketPath string BufferSize int Timeout int conn net.Conn } // NewSocket creates a new socket func NewSocket(socketPath string) *BirdSocket { return &BirdSocket{SocketPath: socketPath, BufferSize: 4096, Timeout: 30} } // Query sends an ad hoc query to Bird and waits for the reply func Query(socketPath, qry string) ([]byte, error) { s := NewSocket(socketPath) _, err := s.Connect() if err != nil { return nil, err } defer s.Close() return s.Query(qry) } // Connect connects to the Bird unix socket func (s *BirdSocket) Connect() ([]byte, error) { var err error s.conn, err = net.Dial("unix", s.SocketPath) if err != nil { return nil, err } buf := make([]byte, s.BufferSize) n, err := s.conn.Read(buf[:]) if err != nil { return nil, err } return buf[:n], err } // Close closes the connection to the socket func (s *BirdSocket) Close() { if s.conn != nil { s.conn.Close() } } // Query sends an query to Bird and waits for the reply func (s *BirdSocket) Query(qry string) ([]byte, error) { _, err := s.conn.Write([]byte(strings.Trim(qry, "\n") + "\n")) if err != nil { return nil, err } output, err := s.readFromSocket(s.conn) if err != nil { return nil, err } return output, nil } func (s *BirdSocket) readFromSocket(conn net.Conn) ([]byte, error) { b := make([]byte, 0) buf := make([]byte, s.BufferSize) done := false for !done { n, err := conn.Read(buf[:]) if err != nil { return nil, err } b = append(b, buf[:n]...) done = endsWithBirdReturnCode(b) } return b, nil } func endsWithBirdReturnCode(b []byte) bool { if len(b) < 6 { return false } return birdReturnCodeRegex.Match(b[len(b)-6:]) } prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/testutils/000077500000000000000000000000001415316745700263545ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/testutils/.travis.yml000066400000000000000000000000151415316745700304610ustar00rootroot00000000000000language: go prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/testutils/LICENSE000066400000000000000000000020601415316745700273570ustar00rootroot00000000000000MIT License Copyright (c) 2016 Daniel Czerwonk Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/testutils/README.md000066400000000000000000000006121415316745700276320ustar00rootroot00000000000000# testutils [![Build Status](https://travis-ci.org/czerwonk/testutils.svg)][travis] Simple collection of assertion functions to prevent boilerplate code ## Remark this collection will grow in the future ## Install ``` go get -u github.com/czerwonk/testutils ``` ## License (c) Daniel Czerwonk, 2016. Licensed under [MIT](LICENSE) license. [travis]: https://travis-ci.org/czerwonk/testutils prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/testutils/assert/000077500000000000000000000000001415316745700276555ustar00rootroot00000000000000prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/testutils/assert/assert.go000066400000000000000000000034651415316745700315150ustar00rootroot00000000000000package assert import "testing" const equalError string = "%s: expected %v but got %v" type Assertion func() bool func StringEqual(name string, expected, current string, t *testing.T) { if current != expected { t.Fatalf(equalError, name, expected, current) } } func IntEqual(name string, expected, current int, t *testing.T) { if current != expected { t.Fatalf(equalError, name, expected, current) } } func ByteEqual(name string, expected, current byte, t *testing.T) { if current != expected { t.Fatalf(equalError, name, expected, current) } } func Int32Equal(name string, expected, current int32, t *testing.T) { if current != expected { t.Fatalf(equalError, name, expected, current) } } func Int64Equal(name string, expected, current int64, t *testing.T) { if current != expected { t.Fatalf(equalError, name, expected, current) } } func Float32Equal(name string, expected, current float32, t *testing.T) { if current != expected { t.Fatalf(equalError, name, expected, current) } } func Float64Equal(name string, expected, current float64, t *testing.T) { if current != expected { t.Fatalf(equalError, name, expected, current) } } func Complex64Equal(name string, expected, current complex64, t *testing.T) { if current != expected { t.Fatalf(equalError, name, expected, current) } } func Complex128Equal(name string, expected, current complex128, t *testing.T) { if current != expected { t.Fatalf(equalError, name, expected, current) } } func True(name string, current bool, t *testing.T) { if !current { t.Fatalf(equalError, name, true, false) } } func False(name string, current bool, t *testing.T) { if current { t.Fatalf(equalError, name, false, true) } } func That(name, text string, assertion Assertion, t *testing.T) { if !assertion() { t.Fatalf("%s: %s", name, text) } } prometheus-bird-exporter-1.2.6+ds/vendor/github.com/czerwonk/testutils/assert/assert_test.go000066400000000000000000000023361415316745700325500ustar00rootroot00000000000000package assert import "testing" func TestStringEqual(t *testing.T) { var x string = "x" var y string = "x" StringEqual("test", x, y, t) } func TestIntEqual(t *testing.T) { var x int = 123 var y int = 123 IntEqual("test", x, y, t) } func TestByteEqual(t *testing.T) { var x int = 123 var y int = 123 IntEqual("test", x, y, t) } func TestInt32Equal(t *testing.T) { var x int32 = 123 var y int32 = 123 Int32Equal("test", x, y, t) } func TestInt64Equal(t *testing.T) { var x int64 = 123 var y int64 = 123 Int64Equal("test", x, y, t) } func TestFloat32Equal(t *testing.T) { var x float32 = 1.23 var y float32 = 1.23 Float32Equal("test", x, y, t) } func TestFloat64Equal(t *testing.T) { var x float64 = 1.23 var y float64 = 1.23 Float64Equal("test", x, y, t) } func TestComplex64Equal(t *testing.T) { var x complex64 = 1.23 var y complex64 = 1.23 Complex64Equal("test", x, y, t) } func TestComplex128Equal(t *testing.T) { var x complex128 = 1.23 var y complex128 = 1.23 Complex128Equal("test", x, y, t) } func TestTrue(t *testing.T) { True("test", true, t) } func TestFalse(t *testing.T) { False("test", false, t) } func TestThat(t *testing.T) { That("test", "foo", func() bool { return true }, t) }