diff --git a/adapters/rubicon/rubicon.go b/adapters/rubicon/rubicon.go index 5eddc83220c..0e4abcd5728 100644 --- a/adapters/rubicon/rubicon.go +++ b/adapters/rubicon/rubicon.go @@ -1,6 +1,7 @@ package rubicon import ( + "container/list" "encoding/json" "fmt" "net/http" @@ -405,7 +406,7 @@ func (a *RubiconAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *ada siteExtRP := rubiconSiteExt{RP: rubiconSiteExtRP{SiteID: int(siteId)}} if siteCopy.Content != nil { siteTarget := make(map[string]interface{}) - updateExtWithIabAttribute(siteTarget, siteCopy.Content.Data, []int{1, 2, 5, 6}) + updateExtWithIabAndSegtaxAttribute(siteTarget, siteCopy.Content.Data, []int{1, 2, 5, 6}) if len(siteTarget) > 0 { updatedSiteTarget, err := json.Marshal(siteTarget) if err != nil { @@ -754,7 +755,7 @@ func updateUserRpTargetWithFpdAttributes(visitor json.RawMessage, user openrtb2. if err != nil { return nil, err } - updateExtWithIabAttribute(target, user.Data, []int{4}) + updateExtWithIabAndSegtaxAttribute(target, user.Data, []int{4}) updatedTarget, err := json.Marshal(target) if err != nil { @@ -763,13 +764,107 @@ func updateUserRpTargetWithFpdAttributes(visitor json.RawMessage, user openrtb2. return updatedTarget, nil } -func updateExtWithIabAttribute(target map[string]interface{}, data []openrtb2.Data, segTaxes []int) { - var segmentIdsToCopy = getSegmentIdsToCopy(data, segTaxes) - if len(segmentIdsToCopy) == 0 { +func updateExtWithIabAndSegtaxAttribute(target map[string]interface{}, data []openrtb2.Data, segTaxes []int) { + taxonomyIdToSegments := getTaxonomyIdToSegments(data) + if len(taxonomyIdToSegments) == 0 { return } - target["iab"] = segmentIdsToCopy + relevantSegments := pickRelevantSegments(taxonomyIdToSegments) + groupedSegments := groupSegments(relevantSegments, segTaxes) + + for key, value := range groupedSegments { + target[key] = value + } +} + +func getTaxonomyIdToSegments(data []openrtb2.Data) map[int]*list.List { + var taxonomyIdToSegments = make(map[int]*list.List) + for _, dataRecord := range data { + if dataRecord.Ext == nil { + continue + } + + var dataRecordExt rubiconDataExt + err := json.Unmarshal(dataRecord.Ext, &dataRecordExt) + if err != nil { + continue + } + + taxonomyId := dataRecordExt.SegTax + originalSegments := dataRecord.Segment + if len(originalSegments) == 0 { + continue + } + + segments, exists := taxonomyIdToSegments[taxonomyId] + if !exists { + segments = list.New() + taxonomyIdToSegments[taxonomyId] = segments + } + + for _, originalSegment := range originalSegments { + if originalSegment.ID != "" { + segments.PushBack(&list.Element{Value: originalSegment}) + } + } + + if segments.Len() == 0 { + delete(taxonomyIdToSegments, taxonomyId) + } + } + + return taxonomyIdToSegments +} + +func pickRelevantSegments(taxonomyIdToSegments map[int]*list.List) map[int][]string { + var relevantSegments = make(map[int][]string) + taxonomyIds := make([]int, 0) + + for taxonomyId := range taxonomyIdToSegments { + taxonomyIds = append(taxonomyIds, taxonomyId) + } + + i := 0 + consumedSegmentsCount := 0 + for consumedSegmentsCount < 100 && len(taxonomyIds) > 0 { + taxonomyIdIndex := i % len(taxonomyIds) + taxonomyId := taxonomyIds[taxonomyIdIndex] + currentSegments := taxonomyIdToSegments[taxonomyId] + + lastSegment := currentSegments.Remove(currentSegments.Back()).(*list.Element).Value.(openrtb2.Segment) + + if _, exists := relevantSegments[taxonomyId]; !exists { + relevantSegments[taxonomyId] = make([]string, 0) + } + relevantSegments[taxonomyId] = append(relevantSegments[taxonomyId], lastSegment.ID) + consumedSegmentsCount++ + + if currentSegments.Len() == 0 { + taxonomyIds = append(taxonomyIds[:taxonomyIdIndex], taxonomyIds[taxonomyIdIndex+1:]...) + i-- + } + i++ + } + + return relevantSegments +} + +func groupSegments(taxonomyIdToSegmentsIds map[int][]string, segTaxes []int) map[string][]string { + var groupedSegments = make(map[string][]string) + for taxonomyId, segmentsIds := range taxonomyIdToSegmentsIds { + segmentName := "iab" + if !contains(segTaxes, taxonomyId) { + segmentName = "tax" + strconv.Itoa(taxonomyId) + } + + if _, exists := groupedSegments[segmentName]; !exists { + groupedSegments[segmentName] = make([]string, 0) + } + groupedSegments[segmentName] = append(groupedSegments[segmentName], segmentsIds...) + } + + return groupedSegments } func populateFirstPartyDataAttributes(source json.RawMessage, target map[string]interface{}) error { @@ -848,26 +943,6 @@ func mapFromRawJSON(message json.RawMessage) (map[string]interface{}, error) { return targetAsMap, nil } -func getSegmentIdsToCopy(data []openrtb2.Data, segTaxValues []int) []string { - var segmentIdsToCopy = make([]string, 0, len(data)) - - for _, dataRecord := range data { - if dataRecord.Ext != nil { - var dataExtObject rubiconDataExt - err := jsonutil.Unmarshal(dataRecord.Ext, &dataExtObject) - if err != nil { - continue - } - if contains(segTaxValues, dataExtObject.SegTax) { - for _, segment := range dataRecord.Segment { - segmentIdsToCopy = append(segmentIdsToCopy, segment.ID) - } - } - } - } - return segmentIdsToCopy -} - func contains(s []int, e int) bool { for _, a := range s { if a == e { diff --git a/adapters/rubicon/rubicon_test.go b/adapters/rubicon/rubicon_test.go index 06a603b9d71..28eeebe0c4c 100644 --- a/adapters/rubicon/rubicon_test.go +++ b/adapters/rubicon/rubicon_test.go @@ -778,6 +778,99 @@ func TestOpenRTBRequestWithVideoImpAndEnabledRewardedInventoryFlag(t *testing.T) "Unexpected VideoType. Got %s. Expected %s", videoExt.VideoType, "rewarded") } +func TestOpenRTBRequestWithTooManySegments(t *testing.T) { + generateDataEntry := func(segtax int, idFrom int, idTo int) openrtb2.Data { + segment := make([]openrtb2.Segment, idTo-idFrom) + + for i := 0; i < idTo-idFrom; i++ { + segment[i] = openrtb2.Segment{ + ID: strconv.Itoa(idFrom + i), + } + } + + return openrtb2.Data{ + Segment: segment, + Ext: json.RawMessage(`{"segtax": ` + strconv.Itoa(segtax) + `}`), + } + } + + bidder := new(RubiconAdapter) + + request := &openrtb2.BidRequest{ + ID: "test-request-id", + Imp: []openrtb2.Imp{{ + ID: "test-imp-id", + Banner: &openrtb2.Banner{ + Format: []openrtb2.Format{ + {W: 300, H: 250}, + }, + }, + Ext: json.RawMessage(`{ + "bidder": { + "zoneId": 8394, + "siteId": 283282, + "accountId": 7891 + } + }`), + }}, + App: &openrtb2.App{ + ID: "com.test", + Name: "testApp", + }, + User: &openrtb2.User{ + Data: []openrtb2.Data{ + generateDataEntry(4, 1, 50), + generateDataEntry(4, 50, 150), + }, + }, + Site: &openrtb2.Site{ + Content: &openrtb2.Content{ + Data: []openrtb2.Data{ + generateDataEntry(5, 50, 100), + generateDataEntry(6, 100, 150), + generateDataEntry(500, 3, 8), + generateDataEntry(600, 1, 2), + }, + }, + }, + } + + reqs, _ := bidder.MakeRequests(request, &adapters.ExtraRequestInfo{}) + + rubiconReq := &openrtb2.BidRequest{} + reqErr := json.Unmarshal(reqs[0].Body, rubiconReq) + assert.NoError(t, reqErr, "Unexpected error while decoding request.") + + userExt := &rubiconUserExt{} + userErr := json.Unmarshal(rubiconReq.User.Ext, userExt) + assert.NoError(t, userErr, "Error unmarshalling request.user.ext object.") + userExtRpTarget := map[string][]string{} + userErr = json.Unmarshal(userExt.RP.Target, &userExtRpTarget) + assert.NoError(t, userErr, "Error unmarshalling request.user.ext.rp.target object.") + + siteExt := &rubiconSiteExt{} + siteErr := json.Unmarshal(rubiconReq.Site.Ext, siteExt) + assert.NoError(t, siteErr, "Error unmarshalling request.site.ext object.") + siteExtRpTarget := map[string][]string{} + siteErr = json.Unmarshal(siteExt.RP.Target, &siteExtRpTarget) + assert.NoError(t, userErr, "Error unmarshalling request.site.ext.rp.target object.") + + generateDescRange := func(from int, to int) []string { + a := make([]string, to-from) + for i := 0; i < to-from; i++ { + a[i] = strconv.Itoa(to - i - 1) + } + + return a + } + + assert.Equal(t, userExtRpTarget["iab"], generateDescRange(50, 150)) + + assert.ElementsMatch(t, siteExtRpTarget["iab"], append(generateDescRange(53, 100), generateDescRange(103, 150)...)) + assert.ElementsMatch(t, siteExtRpTarget["tax500"], generateDescRange(3, 8)) + assert.ElementsMatch(t, siteExtRpTarget["tax600"], generateDescRange(1, 2)) +} + func TestOpenRTBEmptyResponse(t *testing.T) { httpResp := &adapters.ResponseData{ StatusCode: http.StatusNoContent, diff --git a/adapters/rubicon/rubicontest/exemplary/25-26-transition-period.json b/adapters/rubicon/rubicontest/exemplary/25-26-transition-period.json index 52cad5919eb..cc86da97414 100644 --- a/adapters/rubicon/rubicontest/exemplary/25-26-transition-period.json +++ b/adapters/rubicon/rubicontest/exemplary/25-26-transition-period.json @@ -13,44 +13,7 @@ "pagecat": [ "val1", "val2" - ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - } + ] }, "user": { "yob": 2000, @@ -60,60 +23,6 @@ "lon": -122.346200 }, "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "consent": "consent" } @@ -131,7 +40,6 @@ "ver": "1.0" } } - }, "regs": { "ext": { @@ -194,53 +102,9 @@ "val1", "val2" ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - }, "ext": { "rp": { - "site_id": 113932, - "target": { - "iab": [ - "segmentId1", - "segmentId2", - "segmentId3" - ] - } + "site_id": 113932 } }, "publisher": { @@ -252,68 +116,10 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "consent": "consent", "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } @@ -388,7 +194,9 @@ } ] }, - "impIDs":["test-imp-id"] + "impIDs": [ + "test-imp-id" + ] }, "mockResponse": { "status": 200, diff --git a/adapters/rubicon/rubicontest/exemplary/app-imp-fpd.json b/adapters/rubicon/rubicontest/exemplary/app-imp-fpd.json index 8982f95bff5..1968f209797 100644 --- a/adapters/rubicon/rubicontest/exemplary/app-imp-fpd.json +++ b/adapters/rubicon/rubicontest/exemplary/app-imp-fpd.json @@ -46,60 +46,6 @@ "lon": -122.346200 }, "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "data": { "attr1": "val1", @@ -207,60 +153,6 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { @@ -282,10 +174,6 @@ ], "attr5": [ "3" - ], - "iab": [ - "idToCopy", - "idToCopy2" ] } } diff --git a/adapters/rubicon/rubicontest/exemplary/flexible-schema.json b/adapters/rubicon/rubicontest/exemplary/flexible-schema.json index 54399b0adf0..c820a23fd23 100644 --- a/adapters/rubicon/rubicontest/exemplary/flexible-schema.json +++ b/adapters/rubicon/rubicontest/exemplary/flexible-schema.json @@ -46,60 +46,6 @@ "lon": -122.346200 }, "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "data": { "attr1": "val1", @@ -208,60 +154,6 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { @@ -283,10 +175,6 @@ ], "attr5": [ "3" - ], - "iab": [ - "idToCopy", - "idToCopy2" ] } } diff --git a/adapters/rubicon/rubicontest/exemplary/hardcode-secure.json b/adapters/rubicon/rubicontest/exemplary/hardcode-secure.json index 2040933b48e..bd65b9f5757 100644 --- a/adapters/rubicon/rubicontest/exemplary/hardcode-secure.json +++ b/adapters/rubicon/rubicontest/exemplary/hardcode-secure.json @@ -13,44 +13,7 @@ "pagecat": [ "val1", "val2" - ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - } + ] }, "user": { "yob": 2000, @@ -59,61 +22,7 @@ "lat": 47.627500, "lon": -122.346200 }, - "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] + "gender": "f" }, "imp": [ { @@ -167,53 +76,9 @@ "val1", "val2" ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - }, "ext": { "rp": { - "site_id": 113932, - "target": { - "iab": [ - "segmentId1", - "segmentId2", - "segmentId3" - ] - } + "site_id": 113932 } }, "publisher": { @@ -225,67 +90,9 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } @@ -333,7 +140,9 @@ } ] }, - "impIDs":["test-imp-id"] + "impIDs": [ + "test-imp-id" + ] }, "mockResponse": { "status": 200, diff --git a/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json b/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json new file mode 100644 index 00000000000..526e02c52a1 --- /dev/null +++ b/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json @@ -0,0 +1,501 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "device": { + "ip": "123.123.123.123", + "ifa": "zxcjbzxmc-zxcbmz-zxbcz-zxczx" + }, + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "site": { + "pagecat": [ + "val1", + "val2" + ], + "content": { + "data": [ + { + "ext": { + "segtax": 1 + }, + "segment": [ + { + "id": "segmentId1" + }, + { + "id": "segmentId2" + } + ] + }, + { + "ext": { + "segtax": "1" + }, + "segment": [ + { + "id": "shouldNotBeCopied" + } + ] + }, + { + "ext": { + "segtax": 2 + }, + "segment": [ + { + "id": "segmentId3" + } + ] + }, + { + "ext": { + "segtax": 10 + }, + "segment": [ + { + "id": "segmentId4" + } + ] + } + ] + } + }, + "user": { + "yob": 2000, + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "gender": "f", + "data": [ + { + "ext": { + "segtax": 4 + }, + "segment": [ + { + "id": "idToCopy" + } + ] + }, + { + "ext": { + "segtax": "someValue" + }, + "segment": [ + { + "id": "shouldNotBeCopied" + } + ] + }, + { + "ext": { + "segtax": "4" + }, + "segment": [ + { + "id": "shouldNotBeCopied2" + } + ] + }, + { + "ext": { + "segtax": 4 + }, + "segment": [ + { + "id": "idToCopy2" + } + ] + }, + { + "ext": { + "segtax": [ + 4 + ] + }, + "segment": [ + { + "id": "shouldNotBeCopied3" + } + ] + }, + { + "ext": { + "segtax": 2 + }, + "segment": [ + { + "id": "idToCopy3" + } + ] + } + ], + "ext": { + "consent": "consent" + } + }, + "source": { + "ext": { + "schain": { + "complete": 0, + "nodes": [ + { + "asi": "asi", + "sid": "sid" + } + ], + "ver": "1.0" + } + } + }, + "regs": { + "ext": { + "gdpr": 1, + "us_privacy": "us_privacy" + } + }, + "imp": [ + { + "id": "test-imp-id", + "instl": 1, + "banner": { + "w": 1024, + "h": 576 + }, + "ext": { + "data": { + "pbadslot": "pbadslot" + }, + "bidder": { + "accountId": 1001, + "siteId": 113932, + "zoneId": 535510, + "pchain": "pchain" + }, + "skadn": { + "version": "1.0", + "sourceapp": "000", + "skadnetlist": { + "max": 0, + "excl": [ + 1 + ], + "addl": [ + "x.skadnetwork" + ] + } + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "uri?tk_xint=pbs-test-tracker", + "body": { + "id": "test-request-id", + "device": { + "ext": { + "rp": { + "pixelratio": 0 + } + }, + "ip": "123.123.123.123", + "ifa": "zxcjbzxmc-zxcbmz-zxbcz-zxczx" + }, + "site": { + "pagecat": [ + "val1", + "val2" + ], + "content": { + "data": [ + { + "ext": { + "segtax": 1 + }, + "segment": [ + { + "id": "segmentId1" + }, + { + "id": "segmentId2" + } + ] + }, + { + "ext": { + "segtax": "1" + }, + "segment": [ + { + "id": "shouldNotBeCopied" + } + ] + }, + { + "ext": { + "segtax": 2 + }, + "segment": [ + { + "id": "segmentId3" + } + ] + }, + { + "ext": { + "segtax": 10 + }, + "segment": [ + { + "id": "segmentId4" + } + ] + } + ] + }, + "ext": { + "rp": { + "site_id": 113932, + "target": { + "iab": [ + "segmentId2", + "segmentId1", + "segmentId3" + ], + "tax10": [ + "segmentId4" + ] + } + } + }, + "publisher": { + "ext": { + "rp": { + "account_id": 1001 + } + } + } + }, + "user": { + "data": [ + { + "ext": { + "segtax": 4 + }, + "segment": [ + { + "id": "idToCopy" + } + ] + }, + { + "ext": { + "segtax": "someValue" + }, + "segment": [ + { + "id": "shouldNotBeCopied" + } + ] + }, + { + "ext": { + "segtax": "4" + }, + "segment": [ + { + "id": "shouldNotBeCopied2" + } + ] + }, + { + "ext": { + "segtax": 4 + }, + "segment": [ + { + "id": "idToCopy2" + } + ] + }, + { + "ext": { + "segtax": [ + 4 + ] + }, + "segment": [ + { + "id": "shouldNotBeCopied3" + } + ] + }, + { + "ext": { + "segtax": 2 + }, + "segment": [ + { + "id": "idToCopy3" + } + ] + } + ], + "ext": { + "consent": "consent", + "rp": { + "target": { + "iab": [ + "idToCopy2", + "idToCopy" + ], + "tax2": [ + "idToCopy3" + ] + } + } + } + }, + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "source": { + "pchain": "pchain", + "ext": { + "schain": { + "complete": 0, + "nodes": [ + { + "asi": "asi", + "sid": "sid" + } + ], + "ver": "1.0" + } + } + }, + "regs": { + "ext": { + "gdpr": 1, + "us_privacy": "us_privacy" + } + }, + "imp": [ + { + "id": "test-imp-id", + "instl": 1, + "secure": 1, + "banner": { + "ext": { + "rp": { + "mime": "text/html" + } + }, + "w": 1024, + "h": 576 + }, + "ext": { + "rp": { + "target": { + "pbadslot": "pbadslot", + "pbs_login": "xuser", + "pbs_url": "http://hosturl.com", + "pbs_version": "" + }, + "track": { + "mint": "", + "mint_version": "" + }, + "zone_id": 535510 + }, + "skadn": { + "skadnetlist": { + "max": 0, + "excl": [ + 1 + ], + "addl": [ + "x.skadnetwork" + ] + }, + "sourceapp": "000", + "version": "1.0" + } + } + } + ] + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "buyer": "123", + "bid": [ + { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "some-test-ad", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "ext": { + "prebid": { + "meta": { + "networkId": 123 + }, + "type": "banner" + } + } + } + ], + "seat": "adman" + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "some-test-ad", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "ext": { + "prebid": { + "meta": { + "networkId": 123 + }, + "type": "banner" + } + } + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/rubicon/rubicontest/exemplary/simple-banner.json b/adapters/rubicon/rubicontest/exemplary/simple-banner.json index 86663034adb..e1d2c63b78e 100644 --- a/adapters/rubicon/rubicontest/exemplary/simple-banner.json +++ b/adapters/rubicon/rubicontest/exemplary/simple-banner.json @@ -13,44 +13,7 @@ "pagecat": [ "val1", "val2" - ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - } + ] }, "user": { "yob": 2000, @@ -60,61 +23,7 @@ "lon": -122.346200 }, "gender": "f", - "consent": "consent", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] + "consent": "consent" }, "imp": [ { @@ -171,53 +80,9 @@ "val1", "val2" ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - }, "ext": { "rp": { - "site_id": 113932, - "target": { - "iab": [ - "segmentId1", - "segmentId2", - "segmentId3" - ] - } + "site_id": 113932 } }, "publisher": { @@ -229,68 +94,10 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "consent": "consent", "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } diff --git a/adapters/rubicon/rubicontest/exemplary/simple-native.json b/adapters/rubicon/rubicontest/exemplary/simple-native.json index 576faecbee4..34f24d55c8d 100644 --- a/adapters/rubicon/rubicontest/exemplary/simple-native.json +++ b/adapters/rubicon/rubicontest/exemplary/simple-native.json @@ -13,44 +13,7 @@ "pagecat": [ "val1", "val2" - ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - } + ] }, "user": { "yob": 2000, @@ -59,61 +22,7 @@ "lat": 47.627500, "lon": -122.346200 }, - "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] + "gender": "f" }, "imp": [ { @@ -158,53 +67,9 @@ "val1", "val2" ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - }, "ext": { "rp": { - "site_id": 113932, - "target": { - "iab": [ - "segmentId1", - "segmentId2", - "segmentId3" - ] - } + "site_id": 113932 } }, "publisher": { @@ -216,67 +81,9 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } diff --git a/adapters/rubicon/rubicontest/exemplary/simple-video.json b/adapters/rubicon/rubicontest/exemplary/simple-video.json index ccdfab1699c..5f5212be2b8 100644 --- a/adapters/rubicon/rubicontest/exemplary/simple-video.json +++ b/adapters/rubicon/rubicontest/exemplary/simple-video.json @@ -13,44 +13,7 @@ "pagecat": [ "val1", "val2" - ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - } + ] }, "user": { "yob": 2000, @@ -59,61 +22,7 @@ "lat": 47.627500, "lon": -122.346200 }, - "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] + "gender": "f" }, "imp": [ { @@ -167,53 +76,9 @@ "val1", "val2" ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - }, "ext": { "rp": { - "site_id": 113932, - "target": { - "iab": [ - "segmentId1", - "segmentId2", - "segmentId3" - ] - } + "site_id": 113932 } }, "publisher": { @@ -225,67 +90,9 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } diff --git a/adapters/rubicon/rubicontest/exemplary/site-imp-fpd.json b/adapters/rubicon/rubicontest/exemplary/site-imp-fpd.json index 9a8468ce15a..ab42f481c66 100644 --- a/adapters/rubicon/rubicontest/exemplary/site-imp-fpd.json +++ b/adapters/rubicon/rubicontest/exemplary/site-imp-fpd.json @@ -39,82 +39,6 @@ ], "attr7": 1.23 } - }, - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "2" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": 5 - }, - "segment": [ - { - "id": "idToCopy3" - } - ] - }, - { - "ext": { - "segtax": 6 - }, - "segment": [ - { - "id": "idToCopy4" - } - ] - }, - { - "ext": { - "segtax": [ - 2 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] } }, "user": { @@ -124,61 +48,7 @@ "lat": 47.627500, "lon": -122.346200 }, - "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] + "gender": "f" }, "imp": [ { @@ -243,93 +113,9 @@ "page": "somePage", "ref": "someRef", "search": "someSearch", - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "2" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": 5 - }, - "segment": [ - { - "id": "idToCopy3" - } - ] - }, - { - "ext": { - "segtax": 6 - }, - "segment": [ - { - "id": "idToCopy4" - } - ] - }, - { - "ext": { - "segtax": [ - 2 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] - }, "ext": { "rp": { - "site_id": 113932, - "target": { - "iab": [ - "idToCopy", - "idToCopy2", - "idToCopy3", - "idToCopy4" - ] - } + "site_id": 113932 } }, "publisher": { @@ -341,67 +127,9 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } diff --git a/adapters/rubicon/rubicontest/exemplary/user-fpd.json b/adapters/rubicon/rubicontest/exemplary/user-fpd.json index a03234d48d4..f685e5581e8 100644 --- a/adapters/rubicon/rubicontest/exemplary/user-fpd.json +++ b/adapters/rubicon/rubicontest/exemplary/user-fpd.json @@ -18,60 +18,6 @@ "lon": -122.346200 }, "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "keywords": "someKeywords", "ext": { "rp": { @@ -158,60 +104,6 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { @@ -225,10 +117,6 @@ ], "dataKey3": [ "true" - ], - "iab": [ - "idToCopy", - "idToCopy2" ] } } diff --git a/adapters/rubicon/rubicontest/supplemental/no-site-content-data.json b/adapters/rubicon/rubicontest/supplemental/no-site-content-data.json index b7d8f84287b..a51bfa09097 100644 --- a/adapters/rubicon/rubicontest/supplemental/no-site-content-data.json +++ b/adapters/rubicon/rubicontest/supplemental/no-site-content-data.json @@ -18,60 +18,6 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] }, "imp": [ { @@ -137,67 +83,9 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } diff --git a/adapters/rubicon/rubicontest/supplemental/no-site-content.json b/adapters/rubicon/rubicontest/supplemental/no-site-content.json index bcdd9acb9a2..b4f143978e1 100644 --- a/adapters/rubicon/rubicontest/supplemental/no-site-content.json +++ b/adapters/rubicon/rubicontest/supplemental/no-site-content.json @@ -16,60 +16,6 @@ ] }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] }, "imp": [ { @@ -133,67 +79,9 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } diff --git a/go.sum b/go.sum index cd2900708bf..a26a2a1e64c 100644 --- a/go.sum +++ b/go.sum @@ -164,6 +164,8 @@ github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZg github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4= +github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc= github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=